1+ using RelogicLabs . JsonSchema . Exceptions ;
2+ using RelogicLabs . JsonSchema . Message ;
3+ using RelogicLabs . JsonSchema . Time ;
4+ using RelogicLabs . JsonSchema . Types ;
5+ using static RelogicLabs . JsonSchema . Message . ErrorCode ;
6+ using static RelogicLabs . JsonSchema . Time . DateTimeType ;
7+
8+ namespace RelogicLabs . JsonSchema . Functions ;
9+
10+ public sealed partial class CoreFunctions
11+ {
12+ public bool Date ( JString target , JString pattern )
13+ => DateTime ( target , pattern , DATE_TYPE ) ;
14+
15+ public bool Time ( JString target , JString pattern )
16+ => DateTime ( target , pattern , TIME_TYPE ) ;
17+
18+ private bool DateTime ( JString target , JString pattern , DateTimeType type )
19+ => ! ReferenceEquals ( new DateTimeFunction ( pattern , type ) . Parse ( Function , target ) , null ) ;
20+
21+ public bool Before ( JDateTime target , JString reference )
22+ {
23+ var dateTime = GetDateTime ( target . GetParser ( ) , reference ) ;
24+ if ( ReferenceEquals ( dateTime , null ) ) return false ;
25+ if ( target . DateTime . Compare ( dateTime . DateTime ) < 0 ) return true ;
26+ var type = target . DateTime . Type ;
27+ var code = type == DATE_TYPE ? BFOR01 : BFOR02 ;
28+ return FailWith ( new JsonSchemaException (
29+ new ErrorDetail ( code , $ "{ type } is not earlier than specified") ,
30+ new ExpectedDetail ( reference , $ "a { type } before { reference } ") ,
31+ new ActualDetail ( target , $ "found { target } which is not inside limit")
32+ ) ) ;
33+ }
34+
35+ public bool After ( JDateTime target , JString reference )
36+ {
37+ var dateTime = GetDateTime ( target . GetParser ( ) , reference ) ;
38+ if ( ReferenceEquals ( dateTime , null ) ) return false ;
39+ if ( target . DateTime . Compare ( dateTime . DateTime ) > 0 ) return true ;
40+ var type = target . DateTime . Type ;
41+ var code = type == DATE_TYPE ? AFTR01 : AFTR02 ;
42+ return FailWith ( new JsonSchemaException (
43+ new ErrorDetail ( code , $ "{ type } is not later than specified") ,
44+ new ExpectedDetail ( reference , $ "a { type } after { reference } ") ,
45+ new ActualDetail ( target , $ "found { target } which is not inside limit")
46+ ) ) ;
47+ }
48+
49+ public bool Range ( JDateTime target , JString start , JString end )
50+ {
51+ var _start = GetDateTime ( target . GetParser ( ) , start ) ;
52+ if ( ReferenceEquals ( _start , null ) ) return false ;
53+ var _end = GetDateTime ( target . GetParser ( ) , end ) ;
54+ if ( ReferenceEquals ( _end , null ) ) return false ;
55+ if ( target . DateTime . Compare ( _start . DateTime ) < 0 )
56+ {
57+ var type = target . DateTime . Type ;
58+ var code = type == DATE_TYPE ? DRNG01 : DRNG02 ;
59+ return FailWith ( new JsonSchemaException (
60+ new ErrorDetail ( code , $ "{ type } is earlier than start { type } ") ,
61+ new ExpectedDetail ( _start , $ "a { type } from or after { _start } ") ,
62+ new ActualDetail ( target , $ "found { target } which is before start { type } ")
63+ ) ) ;
64+ }
65+ if ( target . DateTime . Compare ( _end . DateTime ) > 0 )
66+ {
67+ var type = target . DateTime . Type ;
68+ var code = type == DATE_TYPE ? DRNG03 : DRNG04 ;
69+ return FailWith ( new JsonSchemaException (
70+ new ErrorDetail ( code , $ "{ type } is later than end { type } ") ,
71+ new ExpectedDetail ( _end , $ "a { type } until or before { _end } ") ,
72+ new ActualDetail ( target , $ "found { target } which is after end { type } ")
73+ ) ) ;
74+ }
75+ return true ;
76+ }
77+
78+ public bool Range ( JDateTime target , JUndefined start , JString end )
79+ {
80+ var _end = GetDateTime ( target . GetParser ( ) , end ) ;
81+ if ( ReferenceEquals ( _end , null ) ) return false ;
82+ if ( target . DateTime . Compare ( _end . DateTime ) > 0 )
83+ {
84+ var type = target . DateTime . Type ;
85+ var code = type == DATE_TYPE ? DRNG05 : DRNG06 ;
86+ return FailWith ( new JsonSchemaException (
87+ new ErrorDetail ( code , $ "{ type } is later than end { type } ") ,
88+ new ExpectedDetail ( _end , $ "a { type } until or before { _end } ") ,
89+ new ActualDetail ( target , $ "found { target } which is after end { type } ")
90+ ) ) ;
91+ }
92+ return true ;
93+ }
94+
95+ public bool Range ( JDateTime target , JString start , JUndefined end )
96+ {
97+ var _start = GetDateTime ( target . GetParser ( ) , start ) ;
98+ if ( ReferenceEquals ( _start , null ) ) return false ;
99+ if ( target . DateTime . Compare ( _start . DateTime ) < 0 )
100+ {
101+ var type = target . DateTime . Type ;
102+ var code = type == DATE_TYPE ? DRNG07 : DRNG08 ;
103+ return FailWith ( new JsonSchemaException (
104+ new ErrorDetail ( code , $ "{ type } is earlier than start { type } ") ,
105+ new ExpectedDetail ( _start , $ "a { type } from or after { _start } ") ,
106+ new ActualDetail ( target , $ "found { target } which is before start { type } ")
107+ ) ) ;
108+ }
109+ return true ;
110+ }
111+
112+ public bool Start ( JDateTime target , JString reference )
113+ {
114+ var dateTime = GetDateTime ( target . GetParser ( ) , reference ) ;
115+ if ( ReferenceEquals ( dateTime , null ) ) return false ;
116+ if ( target . DateTime . Compare ( dateTime . DateTime ) < 0 )
117+ {
118+ var type = target . DateTime . Type ;
119+ var code = type == DATE_TYPE ? STRT01 : STRT02 ;
120+ return FailWith ( new JsonSchemaException (
121+ new ErrorDetail ( code , $ "{ type } is earlier than specified") ,
122+ new ExpectedDetail ( dateTime , $ "a { type } from or after { dateTime } ") ,
123+ new ActualDetail ( target , $ "found { target } which is before limit")
124+ ) ) ;
125+ }
126+ return true ;
127+ }
128+
129+ public bool End ( JDateTime target , JString reference )
130+ {
131+ var dateTime = GetDateTime ( target . GetParser ( ) , reference ) ;
132+ if ( ReferenceEquals ( dateTime , null ) ) return false ;
133+ if ( target . DateTime . Compare ( dateTime . DateTime ) > 0 )
134+ {
135+ var type = target . DateTime . Type ;
136+ var code = type == DATE_TYPE ? ENDE01 : ENDE02 ;
137+ return FailWith ( new JsonSchemaException (
138+ new ErrorDetail ( code , $ "{ type } is later than specified") ,
139+ new ExpectedDetail ( dateTime , $ "a { type } until or before { dateTime } ") ,
140+ new ActualDetail ( target , $ "found { target } which is after limit")
141+ ) ) ;
142+ }
143+ return true ;
144+ }
145+
146+ private JDateTime ? GetDateTime ( DateTimeParser parser , JString dateTime )
147+ {
148+ if ( dateTime . Derived is JDateTime _result
149+ && _result . DateTime . Type == parser . Type ) return _result ;
150+ var _dateTime = new DateTimeFunction ( parser ) . Parse ( Function , dateTime ) ;
151+ if ( ReferenceEquals ( _dateTime , null ) ) return null ;
152+ dateTime . Derived = _dateTime . Create ( dateTime ) ;
153+ return ( JDateTime ) dateTime . Derived ;
154+ }
155+ }
0 commit comments