@@ -44,10 +44,10 @@ namespace OpenQA.Selenium.BiDi.Modules.Script;
4444[ JsonDerivedType ( typeof ( SetLocalValue ) , "set" ) ]
4545public abstract record LocalValue
4646{
47- public static implicit operator LocalValue ( bool ? value ) { return value is bool b ? ( b ? True : False ) : Null ; }
48- public static implicit operator LocalValue ( int ? value ) { return value is int i ? Number ( i ) : Null ; }
49- public static implicit operator LocalValue ( double ? value ) { return value is double d ? Number ( d ) : Null ; }
50- public static implicit operator LocalValue ( string ? value ) { return value is null ? Null : String ( value ) ; }
47+ public static implicit operator LocalValue ( bool ? value ) { return value is bool b ? new BooleanLocalValue ( b ) : new NullLocalValue ( ) ; }
48+ public static implicit operator LocalValue ( int ? value ) { return value is int i ? new NumberLocalValue ( i ) : new NullLocalValue ( ) ; }
49+ public static implicit operator LocalValue ( double ? value ) { return value is double d ? new NumberLocalValue ( d ) : new NullLocalValue ( ) ; }
50+ public static implicit operator LocalValue ( string ? value ) { return value is null ? new NullLocalValue ( ) : new StringLocalValue ( value ) ; }
5151
5252 // TODO: Extend converting from types
5353 public static LocalValue ConvertFrom ( object ? value )
@@ -58,22 +58,22 @@ public static LocalValue ConvertFrom(object? value)
5858 return localValue ;
5959
6060 case null :
61- return Null ;
61+ return new NullLocalValue ( ) ;
6262
6363 case bool b :
64- return b ? True : False ;
64+ return new BooleanLocalValue ( b ) ;
6565
6666 case int i :
67- return Number ( i ) ;
67+ return new NumberLocalValue ( i ) ;
6868
6969 case double d :
70- return Number ( d ) ;
70+ return new NumberLocalValue ( d ) ;
7171
7272 case string str :
73- return String ( str ) ;
73+ return new StringLocalValue ( str ) ;
7474
7575 case IEnumerable < object ? > list :
76- return Array ( list . Select ( ConvertFrom ) . ToList ( ) ) ;
76+ return new ArrayLocalValue ( list . Select ( ConvertFrom ) . ToList ( ) ) ;
7777
7878 case object :
7979 {
@@ -88,7 +88,7 @@ public static LocalValue ConvertFrom(object? value)
8888 values . Add ( [ property. Name , ConvertFrom ( property . GetValue ( value ) ) ] ) ;
8989 }
9090
91- return Object ( values ) ;
91+ return new ObjectLocalValue ( values ) ;
9292 }
9393 }
9494 }
@@ -100,22 +100,22 @@ public static LocalValue ConvertFrom(JsonNode? node)
100100 {
101101 if ( node is null )
102102 {
103- return Null ;
103+ return new NullLocalValue ( ) ;
104104 }
105105
106106 switch ( node . GetValueKind ( ) )
107107 {
108108 case System . Text . Json . JsonValueKind . Null :
109- return Null ;
109+ return new NullLocalValue ( ) ;
110110
111111 case System . Text . Json . JsonValueKind . True :
112- return True ;
112+ return new BooleanLocalValue ( true ) ;
113113
114114 case System . Text . Json . JsonValueKind . False :
115- return False ;
115+ return new BooleanLocalValue ( false ) ;
116116
117117 case System . Text . Json . JsonValueKind . String :
118- return String ( node . ToString ( ) ) ;
118+ return new StringLocalValue ( node . ToString ( ) ) ;
119119
120120 case System . Text . Json . JsonValueKind . Number :
121121 {
@@ -125,187 +125,30 @@ public static LocalValue ConvertFrom(JsonNode? node)
125125
126126 if ( bigNumber > MaxDouble || bigNumber < MinDouble )
127127 {
128- return BigInt ( bigNumber ) ;
128+ return new BigIntLocalValue ( numberString ) ;
129129 }
130130
131- return Number ( double . Parse ( numberString ) ) ;
131+ return new NumberLocalValue ( double . Parse ( numberString ) ) ;
132132 }
133133
134134 case System . Text . Json . JsonValueKind . Array :
135- return Array ( node . AsArray ( ) . Select ( ConvertFrom ) ) ;
135+ return new ArrayLocalValue ( node . AsArray ( ) . Select ( ConvertFrom ) ) ;
136136
137137 case System . Text . Json . JsonValueKind . Object :
138- var convertedToListForm = node . AsObject ( ) . Select ( property => new LocalValue [ ] { String ( property . Key ) , ConvertFrom ( property . Value ) } ) . ToList ( ) ;
139- return Object ( convertedToListForm ) ;
138+ var convertedToListForm = node . AsObject ( ) . Select ( property => new LocalValue [ ] { new StringLocalValue ( property . Key ) , ConvertFrom ( property . Value ) } ) . ToList ( ) ;
139+ return new ObjectLocalValue ( convertedToListForm ) ;
140140
141141 default :
142142 throw new InvalidOperationException ( "Invalid JSON node" ) ;
143143 }
144144 }
145-
146- public static ChannelLocalValue Channel ( ChannelLocalValue . ChannelProperties options )
147- {
148- return new ChannelLocalValue ( options ) ;
149- }
150-
151- public static ArrayLocalValue Array ( IEnumerable < LocalValue > values )
152- {
153- return new ArrayLocalValue ( values ) ;
154- }
155-
156- public static SetLocalValue Set ( HashSet < LocalValue > values )
157- {
158- return new SetLocalValue ( values ) ;
159- }
160-
161- public static ObjectLocalValue Object ( IEnumerable < IEnumerable < LocalValue > > values )
162- {
163- return new ObjectLocalValue ( values ) ;
164- }
165-
166- public static ObjectLocalValue Object ( IDictionary < string , LocalValue > values )
167- {
168- var convertedValues = values . Select ( PairToList ) . ToList ( ) ;
169- return new ObjectLocalValue ( convertedValues ) ;
170- }
171-
172- public static MapLocalValue Map ( IEnumerable < IEnumerable < LocalValue > > values )
173- {
174- return new MapLocalValue ( values ) ;
175- }
176-
177- public static MapLocalValue Map ( IDictionary < LocalValue , LocalValue > values )
178- {
179- var convertedValues = values . Select ( PairToList ) . ToList ( ) ;
180- return new MapLocalValue ( convertedValues ) ;
181- }
182-
183- private static LocalValue [ ] PairToList ( KeyValuePair < string , LocalValue > pair )
184- {
185- return [ String ( pair . Key ) , pair . Value ] ;
186- }
187-
188- private static LocalValue [ ] PairToList ( KeyValuePair < LocalValue , LocalValue > pair )
189- {
190- return [ pair . Key , pair . Value ] ;
191- }
192-
193- public static BigIntLocalValue BigInt ( BigInteger value )
194- {
195- return new BigIntLocalValue ( value . ToString ( ) ) ;
196- }
197-
198- public static DateLocalValue Date ( DateTime value )
199- {
200- return new DateLocalValue ( value . ToString ( "o" ) ) ;
201- }
202-
203- public static LocalValue String ( string ? value )
204- {
205- if ( value is null )
206- {
207- return Null ;
208- }
209-
210- return new StringLocalValue ( value ) ;
211- }
212-
213- public static NumberLocalValue Number ( double value )
214- {
215- return new NumberLocalValue ( value ) ;
216- }
217-
218- public static BooleanLocalValue True { get ; } = new BooleanLocalValue ( true ) ;
219-
220- public static BooleanLocalValue False { get ; } = new BooleanLocalValue ( false ) ;
221-
222- public static NullLocalValue Null { get ; } = new NullLocalValue ( ) ;
223-
224- public static UndefinedLocalValue Undefined { get ; } = new UndefinedLocalValue ( ) ;
225- public static RegExpLocalValue Regex ( string pattern , string ? flags = null )
226- {
227- if ( pattern is null )
228- {
229- throw new ArgumentNullException ( nameof ( pattern ) ) ;
230- }
231-
232- return new RegExpLocalValue ( new RegExpValue ( pattern ) { Flags = flags } ) ;
233- }
234-
235- /// <summary>
236- /// Converts a .NET Regex into a BiDi Regex
237- /// </summary>
238- /// <param name="regex">A .NET Regex.</param>
239- /// <returns>A BiDi Regex.</returns>
240- /// <remarks>
241- /// Note that the .NET regular expression engine does not work the same as the JavaScript engine.
242- /// To minimize the differences between the two engines, it is recommended to enabled the <see cref="RegexOptions.ECMAScript"/> option.
243- /// </remarks>
244- public static RegExpLocalValue Regex ( Regex regex )
245- {
246- if ( regex is null )
247- {
248- throw new ArgumentNullException ( nameof ( regex ) ) ;
249- }
250-
251- RegexOptions options = regex . Options ;
252-
253- if ( options == RegexOptions . None )
254- {
255- return new RegExpLocalValue ( new RegExpValue ( regex . ToString ( ) ) ) ;
256- }
257-
258- string flags = string . Empty ;
259-
260- const RegexOptions NonBacktracking = ( RegexOptions ) 1024 ;
261- #if NET8_0_OR_GREATER
262- Debug . Assert ( NonBacktracking == RegexOptions . NonBacktracking ) ;
263- #endif
264-
265- const RegexOptions NonApplicableOptions = RegexOptions . Compiled | NonBacktracking ;
266-
267- const RegexOptions UnsupportedOptions =
268- RegexOptions . ExplicitCapture |
269- RegexOptions . IgnorePatternWhitespace |
270- RegexOptions . RightToLeft |
271- RegexOptions . CultureInvariant ;
272-
273- options &= ~ NonApplicableOptions ;
274-
275- if ( ( options & UnsupportedOptions ) != 0 )
276- {
277- throw new NotSupportedException ( $ "The selected RegEx options are not supported in BiDi: { options & UnsupportedOptions } ") ;
278- }
279-
280- if ( ( options & RegexOptions . IgnoreCase ) != 0 )
281- {
282- flags += "i" ;
283- options = options & ~ RegexOptions . IgnoreCase ;
284- }
285-
286- if ( ( options & RegexOptions . Multiline ) != 0 )
287- {
288- options = options & ~ RegexOptions . Multiline ;
289- flags += "m" ;
290- }
291-
292- if ( ( options & RegexOptions . Singleline ) != 0 )
293- {
294- options = options & ~ RegexOptions . Singleline ;
295- flags += "s" ;
296- }
297-
298- Debug . Assert ( options == RegexOptions . None ) ;
299-
300- return new RegExpLocalValue ( new RegExpValue ( regex . ToString ( ) ) { Flags = flags } ) ;
301- }
302145}
303146
304147public abstract record PrimitiveProtocolLocalValue : LocalValue ;
305148
306149public record NumberLocalValue ( double Value ) : PrimitiveProtocolLocalValue
307150{
308- public static explicit operator NumberLocalValue ( double n ) => new NumberLocalValue ( n ) ;
151+ public static implicit operator NumberLocalValue ( double n ) => new NumberLocalValue ( n ) ;
309152}
310153
311154public record StringLocalValue ( string Value ) : PrimitiveProtocolLocalValue ;
0 commit comments