1+ using System . ComponentModel . DataAnnotations ;
2+ using System . Net ;
3+ using System . Net . Sockets ;
4+ using Cel . Common . Types ;
5+ using Cel . Common . Types . Ref ;
6+ using Cel . Interpreter . Functions ;
7+
8+ namespace Confluent . SchemaRegistry . Rules
9+ {
10+ public class BuiltinOverload
11+ {
12+ private const string OverloadIsEmail = "isEmail" ;
13+ private const string OverloadIsHostname = "isHostname" ;
14+ private const string OverloadIsIpv4 = "isIpv4" ;
15+ private const string OverloadIsIpv6 = "isIpv6" ;
16+ private const string OverloadIsUri = "isUri" ;
17+ private const string OverloadIsUriRef = "isUriRef" ;
18+ private const string OverloadIsUuid = "isUuid" ;
19+
20+ public static Overload [ ] Create ( )
21+ {
22+ return new Overload [ ]
23+ {
24+ IsEmail ( ) ,
25+ IsHostname ( ) ,
26+ IsIpv4 ( ) ,
27+ IsIpv6 ( ) ,
28+ IsUri ( ) ,
29+ IsUriRef ( ) ,
30+ IsUuid ( ) ,
31+ } ;
32+ }
33+
34+ private static Overload IsEmail ( )
35+ {
36+ return Overload . Unary (
37+ OverloadIsEmail ,
38+ value =>
39+ {
40+ if ( value . Type ( ) . TypeEnum ( ) != TypeEnum . String )
41+ {
42+ return Err . NoSuchOverload ( value , OverloadIsEmail , null ) ;
43+ }
44+
45+ string input = ( string ) value . Value ( ) ;
46+ return string . IsNullOrEmpty ( input )
47+ ? BoolT . False
48+ : Types . BoolOf ( ValidateEmail ( input ) ) ;
49+ } ) ;
50+ }
51+
52+ private static Overload IsHostname ( )
53+ {
54+ return Overload . Unary (
55+ OverloadIsHostname ,
56+ value =>
57+ {
58+ if ( value . Type ( ) . TypeEnum ( ) != TypeEnum . String )
59+ {
60+ return Err . NoSuchOverload ( value , OverloadIsHostname , null ) ;
61+ }
62+
63+ string input = ( string ) value . Value ( ) ;
64+ return string . IsNullOrEmpty ( input )
65+ ? BoolT . False
66+ : Types . BoolOf ( ValidateHostname ( input ) ) ;
67+ } ) ;
68+ }
69+
70+ private static Overload IsIpv4 ( )
71+ {
72+ return Overload . Unary (
73+ OverloadIsIpv4 ,
74+ value =>
75+ {
76+ if ( value . Type ( ) . TypeEnum ( ) != TypeEnum . String )
77+ {
78+ return Err . NoSuchOverload ( value , OverloadIsIpv4 , null ) ;
79+ }
80+
81+ string input = ( string ) value . Value ( ) ;
82+ return string . IsNullOrEmpty ( input )
83+ ? BoolT . False
84+ : Types . BoolOf ( ValidateIpv4 ( input ) ) ;
85+ } ) ;
86+ }
87+
88+ private static Overload IsIpv6 ( )
89+ {
90+ return Overload . Unary (
91+ OverloadIsIpv6 ,
92+ value =>
93+ {
94+ if ( value . Type ( ) . TypeEnum ( ) != TypeEnum . String )
95+ {
96+ return Err . NoSuchOverload ( value , OverloadIsIpv6 , null ) ;
97+ }
98+
99+ string input = ( string ) value . Value ( ) ;
100+ return string . IsNullOrEmpty ( input )
101+ ? BoolT . False
102+ : Types . BoolOf ( ValidateIpv6 ( input ) ) ;
103+ } ) ;
104+ }
105+
106+ private static Overload IsUri ( )
107+ {
108+ return Overload . Unary (
109+ OverloadIsUri ,
110+ value =>
111+ {
112+ if ( value . Type ( ) . TypeEnum ( ) != TypeEnum . String )
113+ {
114+ return Err . NoSuchOverload ( value , OverloadIsUri , null ) ;
115+ }
116+
117+ string input = ( string ) value . Value ( ) ;
118+ return string . IsNullOrEmpty ( input )
119+ ? BoolT . False
120+ : Types . BoolOf ( ValidateUri ( input ) ) ;
121+ } ) ;
122+ }
123+
124+ private static Overload IsUriRef ( )
125+ {
126+ return Overload . Unary (
127+ OverloadIsUriRef ,
128+ value =>
129+ {
130+ if ( value . Type ( ) . TypeEnum ( ) != TypeEnum . String )
131+ {
132+ return Err . NoSuchOverload ( value , OverloadIsUriRef , null ) ;
133+ }
134+
135+ string input = ( string ) value . Value ( ) ;
136+ return string . IsNullOrEmpty ( input )
137+ ? BoolT . False
138+ : Types . BoolOf ( ValidateUriRef ( input ) ) ;
139+ } ) ;
140+ }
141+
142+ private static Overload IsUuid ( )
143+ {
144+ return Overload . Unary (
145+ OverloadIsUuid ,
146+ value =>
147+ {
148+ if ( value . Type ( ) . TypeEnum ( ) != TypeEnum . String )
149+ {
150+ return Err . NoSuchOverload ( value , OverloadIsUuid , null ) ;
151+ }
152+
153+ string input = ( string ) value . Value ( ) ;
154+ return string . IsNullOrEmpty ( input )
155+ ? BoolT . False
156+ : Types . BoolOf ( ValidateUuid ( input ) ) ;
157+ } ) ;
158+ }
159+
160+ public static bool ValidateEmail ( string input )
161+ {
162+ return new EmailAddressAttribute ( ) . IsValid ( input ) ;
163+ }
164+
165+ public static bool ValidateHostname ( string input )
166+ {
167+ return Uri . CheckHostName ( input ) != UriHostNameType . Unknown ;
168+ }
169+
170+ public static bool ValidateIpv4 ( string input )
171+ {
172+ if ( IPAddress . TryParse ( input , out IPAddress address ) )
173+ {
174+ return address . AddressFamily == AddressFamily . InterNetwork ;
175+ }
176+
177+ return false ;
178+ }
179+
180+ public static bool ValidateIpv6 ( string input )
181+ {
182+ if ( IPAddress . TryParse ( input , out IPAddress address ) )
183+ {
184+ return address . AddressFamily == AddressFamily . InterNetworkV6 ;
185+ }
186+
187+ return false ;
188+ }
189+
190+ public static bool ValidateUri ( string input )
191+ {
192+ return Uri . TryCreate ( input , UriKind . Absolute , out _ ) ;
193+ }
194+
195+ public static bool ValidateUriRef ( string input )
196+ {
197+ return Uri . TryCreate ( input , UriKind . RelativeOrAbsolute , out _ ) ;
198+ }
199+
200+ public static bool ValidateUuid ( string input )
201+ {
202+ return Guid . TryParse ( input , out _ ) ;
203+ }
204+ }
205+ }
0 commit comments