aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Data/IntermediateFieldExtensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixToolset.Data/IntermediateFieldExtensions.cs')
-rw-r--r--src/WixToolset.Data/IntermediateFieldExtensions.cs72
1 files changed, 58 insertions, 14 deletions
diff --git a/src/WixToolset.Data/IntermediateFieldExtensions.cs b/src/WixToolset.Data/IntermediateFieldExtensions.cs
index c551b455..be225452 100644
--- a/src/WixToolset.Data/IntermediateFieldExtensions.cs
+++ b/src/WixToolset.Data/IntermediateFieldExtensions.cs
@@ -11,6 +11,8 @@ namespace WixToolset.Data
11 11
12 public static IntermediateField Set(this IntermediateField field, object value) 12 public static IntermediateField Set(this IntermediateField field, object value)
13 { 13 {
14 var data = value;
15
14 if (field == null) 16 if (field == null)
15 { 17 {
16 throw new ArgumentNullException(nameof(field)); 18 throw new ArgumentNullException(nameof(field));
@@ -21,30 +23,72 @@ namespace WixToolset.Data
21 } 23 }
22 else if (field.Type == IntermediateFieldType.Bool && !(value is bool)) 24 else if (field.Type == IntermediateFieldType.Bool && !(value is bool))
23 { 25 {
24 throw new ArgumentException(nameof(value)); 26 if (value is int)
27 {
28 data = ((int)value) != 0;
29 }
30 else if (value is string str)
31 {
32 if (str.Equals("yes", StringComparison.OrdinalIgnoreCase) || str.Equals("true", StringComparison.OrdinalIgnoreCase))
33 {
34 data = true;
35 }
36 else if (str.Equals("no", StringComparison.OrdinalIgnoreCase) || str.Equals("false", StringComparison.OrdinalIgnoreCase))
37 {
38 data = false;
39 }
40 else
41 {
42 throw new ArgumentException(nameof(value));
43 }
44 }
45 else
46 {
47 throw new ArgumentException(nameof(value));
48 }
25 } 49 }
26 else if (field.Type == IntermediateFieldType.Number && !(value is int)) 50 else if (field.Type == IntermediateFieldType.Number && !(value is int))
27 { 51 {
28 throw new ArgumentException(nameof(value)); 52 if (value is string str && Int32.TryParse(str, out var number))
53 {
54 data = number;
55 }
56 else
57 {
58 throw new ArgumentException(nameof(value));
59 }
29 } 60 }
30 else if (field.Type == IntermediateFieldType.String && !(value is string)) 61 else if (field.Type == IntermediateFieldType.String && !(value is string))
31 { 62 {
32 throw new ArgumentException(nameof(value)); 63 if (value is int)
33 } 64 {
34 else if (field.Type == IntermediateFieldType.Path && !(value is IntermediateFieldPathValue || value is string)) 65 data = value.ToString();
35 { 66 }
36 throw new ArgumentException(nameof(value)); 67 else if (value is bool b)
37 } 68 {
38 69 data = b ? "true" : "false";
39 if (field.Type == IntermediateFieldType.Path && value != null && value is string) 70 }
40 { 71 else
41 value = new IntermediateFieldPathValue { Path = (string)value }; 72 {
73 throw new ArgumentException(nameof(value));
74 }
75 }
76 else if (field.Type == IntermediateFieldType.Path && !(value is IntermediateFieldPathValue))
77 {
78 if (value is string str)
79 {
80 data = new IntermediateFieldPathValue { Path = str };
81 }
82 else
83 {
84 throw new ArgumentException(nameof(value));
85 }
42 } 86 }
43 87
44 field.Value = new IntermediateFieldValue 88 field.Value = new IntermediateFieldValue
45 { 89 {
46 Context = valueContext, 90 Context = valueContext,
47 Data = value, 91 Data = data,
48 PreviousValue = field.Value 92 PreviousValue = field.Value
49 }; 93 };
50 94
@@ -103,7 +147,7 @@ namespace WixToolset.Data
103 return field.Value.AsNumber() != 0; 147 return field.Value.AsNumber() != 0;
104 148
105 case IntermediateFieldType.String: 149 case IntermediateFieldType.String:
106 return !System.String.IsNullOrEmpty(field.Value.AsString()); 150 return !String.IsNullOrEmpty(field.Value.AsString());
107 151
108 default: 152 default:
109 throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to boolean"); 153 throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to boolean");