Skip to content

Commit 0c4f8bf

Browse files
committed
Remote static factory methods for now
1 parent c7cbaf7 commit 0c4f8bf

File tree

2 files changed

+40
-197
lines changed

2 files changed

+40
-197
lines changed

dotnet/src/webdriver/BiDi/Modules/Script/LocalValue.cs

Lines changed: 22 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ namespace OpenQA.Selenium.BiDi.Modules.Script;
4444
[JsonDerivedType(typeof(SetLocalValue), "set")]
4545
public 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

304147
public abstract record PrimitiveProtocolLocalValue : LocalValue;
305148

306149
public 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

311154
public record StringLocalValue(string Value) : PrimitiveProtocolLocalValue;

0 commit comments

Comments
 (0)