@@ -72,7 +72,10 @@ impl RegistryHelper {
72
72
Ok ( Registry {
73
73
key_path : self . config . key_path . clone ( ) ,
74
74
value_name : Some ( value_name. clone ( ) ) ,
75
- value_data : Some ( convert_reg_value ( & value) ?) ,
75
+ value_data : match value {
76
+ Data :: None => None ,
77
+ _ => Some ( convert_reg_value ( & value) ?)
78
+ } ,
76
79
..Default :: default ( )
77
80
} )
78
81
} else {
@@ -100,7 +103,7 @@ impl RegistryHelper {
100
103
} ;
101
104
102
105
if self . what_if {
103
- what_if_metadata. push ( t ! ( "registry_helper.whatIfCreateKey" , " subkey" => subkey) . to_string ( ) ) ;
106
+ what_if_metadata. push ( t ! ( "registry_helper.whatIfCreateKey" , subkey = subkey) . to_string ( ) ) ;
104
107
}
105
108
else {
106
109
reg_key = reg_key. create ( path, Security :: CreateSubKey ) ?;
@@ -116,60 +119,69 @@ impl RegistryHelper {
116
119
Err ( e) => return self . handle_error_or_what_if ( e)
117
120
} ;
118
121
119
- if let Some ( value_data) = & self . config . value_data {
120
- let Ok ( value_name ) = U16CString :: from_str ( self . config . value_name . as_ref ( ) . unwrap ( ) ) else {
121
- return self . handle_error_or_what_if ( RegistryError :: Utf16Conversion ( "valueName" . to_string ( ) ) ) ;
122
- } ;
122
+ let value_data = match & self . config . value_data {
123
+ Some ( value_data ) => value_data ,
124
+ None => & RegistryValueData :: None ,
125
+ } ;
123
126
124
- let data = match value_data {
125
- RegistryValueData :: String ( s) => {
126
- let Ok ( utf16) = U16CString :: from_str ( s) else {
127
- return self . handle_error_or_what_if ( RegistryError :: Utf16Conversion ( "valueData" . to_string ( ) ) ) ;
128
- } ;
129
- Data :: String ( utf16)
130
- } ,
131
- RegistryValueData :: ExpandString ( s) => {
127
+ let Ok ( value_name) = U16CString :: from_str ( self . config . value_name . as_ref ( ) . unwrap ( ) ) else {
128
+ return self . handle_error_or_what_if ( RegistryError :: Utf16Conversion ( "valueName" . to_string ( ) ) ) ;
129
+ } ;
130
+
131
+ let data = match value_data {
132
+ RegistryValueData :: String ( s) => {
133
+ let Ok ( utf16) = U16CString :: from_str ( s) else {
134
+ return self . handle_error_or_what_if ( RegistryError :: Utf16Conversion ( "valueData" . to_string ( ) ) ) ;
135
+ } ;
136
+ Data :: String ( utf16)
137
+ } ,
138
+ RegistryValueData :: ExpandString ( s) => {
139
+ let Ok ( utf16) = U16CString :: from_str ( s) else {
140
+ return self . handle_error_or_what_if ( RegistryError :: Utf16Conversion ( "valueData" . to_string ( ) ) ) ;
141
+ } ;
142
+ Data :: ExpandString ( utf16)
143
+ } ,
144
+ RegistryValueData :: Binary ( b) => {
145
+ Data :: Binary ( b. clone ( ) )
146
+ } ,
147
+ RegistryValueData :: DWord ( d) => {
148
+ Data :: U32 ( * d)
149
+ } ,
150
+ RegistryValueData :: MultiString ( m) => {
151
+ let mut m16: Vec < UCString < u16 > > = Vec :: < UCString < u16 > > :: new ( ) ;
152
+ for s in m {
132
153
let Ok ( utf16) = U16CString :: from_str ( s) else {
133
154
return self . handle_error_or_what_if ( RegistryError :: Utf16Conversion ( "valueData" . to_string ( ) ) ) ;
134
155
} ;
135
- Data :: ExpandString ( utf16)
136
- } ,
137
- RegistryValueData :: Binary ( b) => {
138
- Data :: Binary ( b. clone ( ) )
139
- } ,
140
- RegistryValueData :: DWord ( d) => {
141
- Data :: U32 ( * d)
142
- } ,
143
- RegistryValueData :: MultiString ( m) => {
144
- let mut m16: Vec < UCString < u16 > > = Vec :: < UCString < u16 > > :: new ( ) ;
145
- for s in m {
146
- let Ok ( utf16) = U16CString :: from_str ( s) else {
147
- return self . handle_error_or_what_if ( RegistryError :: Utf16Conversion ( "valueData" . to_string ( ) ) ) ;
148
- } ;
149
- m16. push ( utf16) ;
150
- }
151
- Data :: MultiString ( m16)
152
- } ,
153
- RegistryValueData :: QWord ( q) => {
154
- Data :: U64 ( * q)
155
- } ,
156
- } ;
157
-
158
- if self . what_if {
159
- return Ok ( Some ( Registry {
160
- key_path : self . config . key_path . clone ( ) ,
161
- value_data : Some ( convert_reg_value ( & data) ?) ,
162
- value_name : self . config . value_name . clone ( ) ,
163
- metadata : if what_if_metadata. is_empty ( ) { None } else { Some ( Metadata { what_if : Some ( what_if_metadata) } ) } ,
164
- ..Default :: default ( )
165
- } ) ) ;
166
- }
156
+ m16. push ( utf16) ;
157
+ }
158
+ Data :: MultiString ( m16)
159
+ } ,
160
+ RegistryValueData :: QWord ( q) => {
161
+ Data :: U64 ( * q)
162
+ } ,
163
+ RegistryValueData :: None => {
164
+ Data :: None
165
+ } ,
166
+ } ;
167
167
168
- if let Some ( reg_key) = reg_key {
169
- reg_key. set_value ( & value_name, & data) ?;
170
- } ;
168
+ if self . what_if {
169
+ return Ok ( Some ( Registry {
170
+ key_path : self . config . key_path . clone ( ) ,
171
+ value_data : match data {
172
+ Data :: None => None ,
173
+ _ => Some ( convert_reg_value ( & data) ?) ,
174
+ } ,
175
+ value_name : self . config . value_name . clone ( ) ,
176
+ metadata : if what_if_metadata. is_empty ( ) { None } else { Some ( Metadata { what_if : Some ( what_if_metadata) } ) } ,
177
+ ..Default :: default ( )
178
+ } ) ) ;
171
179
}
172
180
181
+ if let Some ( reg_key) = reg_key {
182
+ reg_key. set_value ( & value_name, & data) ?;
183
+ } ;
184
+
173
185
if self . what_if {
174
186
return Ok ( Some ( Registry {
175
187
key_path : self . config . key_path . clone ( ) ,
@@ -222,8 +234,12 @@ impl RegistryHelper {
222
234
let parent_key: RegKey ;
223
235
let mut subkeys: Vec < & str > = Vec :: new ( ) ;
224
236
let parent_key_path = get_parent_key_path ( & self . subkey ) ;
225
- let subkey_name = & self . subkey [ parent_key_path. len ( ) + 1 ..] ;
226
- subkeys. push ( subkey_name) ;
237
+ let subkey_name = if parent_key_path. is_empty ( ) { & self . subkey } else {
238
+ & self . subkey [ parent_key_path. len ( ) + 1 ..]
239
+ } ;
240
+ if !subkey_name. is_empty ( ) {
241
+ subkeys. push ( subkey_name) ;
242
+ }
227
243
let mut current_key_path = parent_key_path;
228
244
229
245
loop {
@@ -316,6 +332,7 @@ fn convert_reg_value(value: &Data) -> Result<RegistryValueData, RegistryError> {
316
332
Ok ( RegistryValueData :: MultiString ( m) )
317
333
} ,
318
334
Data :: U64 ( q) => Ok ( RegistryValueData :: QWord ( * q) ) ,
335
+ Data :: None => Ok ( RegistryValueData :: None ) ,
319
336
_ => Err ( RegistryError :: UnsupportedValueDataType )
320
337
}
321
338
}
0 commit comments