@@ -177,18 +177,17 @@ impl VlanConfig {
177177
178178 /// Get the network as an Ipv4Network if possible
179179 pub fn as_ipv4_network ( & self ) -> VlanResult < Ipv4Network > {
180- if let Some ( base) = self . ip_network . strip_suffix ( ".x" ) {
181- let network_str = format ! ( "{base}.0/24" ) ;
182- rfc1918:: validate_rfc1918_network_string ( & network_str)
183- } else if let Some ( base) = self . ip_network . strip_suffix ( ".0/24" ) {
184- let network_str = format ! ( "{base}.0/24" ) ;
185- rfc1918:: validate_rfc1918_network_string ( & network_str)
186- } else {
187- Err ( VlanError :: network_parsing ( format ! (
188- "Cannot parse network format: {}" ,
189- self . ip_network
190- ) ) )
191- }
180+ let base = self
181+ . ip_network
182+ . strip_suffix ( ".x" )
183+ . or_else ( || self . ip_network . strip_suffix ( ".0/24" ) )
184+ . ok_or_else ( || {
185+ VlanError :: network_parsing ( format ! (
186+ "Cannot parse network format: {}" ,
187+ self . ip_network
188+ ) )
189+ } ) ?;
190+ rfc1918:: validate_rfc1918_network_string ( & format ! ( "{base}.0/24" ) )
192191 }
193192
194193 /// Validate that this configuration is RFC 1918 compliant
@@ -238,46 +237,34 @@ impl VlanConfig {
238237 "255.255.255.0"
239238 }
240239
240+ /// Extract the three-octet base prefix from the IP network string.
241+ ///
242+ /// Handles both "10.1.2.x" and "10.1.2.0/24" formats, returning "10.1.2".
243+ fn network_base ( & self ) -> Result < & str > {
244+ self . ip_network
245+ . strip_suffix ( ".x" )
246+ . or_else ( || self . ip_network . strip_suffix ( ".0/24" ) )
247+ . ok_or_else ( || {
248+ ConfigError :: validation ( format ! (
249+ "Cannot parse base from IP network: {}" ,
250+ self . ip_network
251+ ) )
252+ } )
253+ }
254+
241255 /// Get the gateway IP address (network + 1)
242256 pub fn gateway_ip ( & self ) -> Result < String > {
243- if let Some ( base) = self . ip_network . strip_suffix ( ".x" ) {
244- Ok ( format ! ( "{base}.1" ) )
245- } else if let Some ( base) = self . ip_network . strip_suffix ( ".0/24" ) {
246- Ok ( format ! ( "{base}.1" ) )
247- } else {
248- Err ( ConfigError :: validation ( format ! (
249- "Cannot derive gateway from IP network: {}" ,
250- self . ip_network
251- ) ) )
252- }
257+ Ok ( format ! ( "{}.1" , self . network_base( ) ?) )
253258 }
254259
255260 /// Get the DHCP range start IP
256261 pub fn dhcp_range_start ( & self ) -> Result < String > {
257- if let Some ( base) = self . ip_network . strip_suffix ( ".x" ) {
258- Ok ( format ! ( "{base}.100" ) )
259- } else if let Some ( base) = self . ip_network . strip_suffix ( ".0/24" ) {
260- Ok ( format ! ( "{base}.100" ) )
261- } else {
262- Err ( ConfigError :: validation ( format ! (
263- "Cannot derive DHCP range from IP network: {}" ,
264- self . ip_network
265- ) ) )
266- }
262+ Ok ( format ! ( "{}.100" , self . network_base( ) ?) )
267263 }
268264
269265 /// Get the DHCP range end IP
270266 pub fn dhcp_range_end ( & self ) -> Result < String > {
271- if let Some ( base) = self . ip_network . strip_suffix ( ".x" ) {
272- Ok ( format ! ( "{base}.200" ) )
273- } else if let Some ( base) = self . ip_network . strip_suffix ( ".0/24" ) {
274- Ok ( format ! ( "{base}.200" ) )
275- } else {
276- Err ( ConfigError :: validation ( format ! (
277- "Cannot derive DHCP range from IP network: {}" ,
278- self . ip_network
279- ) ) )
280- }
267+ Ok ( format ! ( "{}.200" , self . network_base( ) ?) )
281268 }
282269
283270 /// Get the DHCP lease time based on department type (in seconds)
@@ -345,16 +332,7 @@ impl VlanConfig {
345332 let mut reservations = Vec :: new ( ) ;
346333
347334 // Get base network for IP assignments
348- let base = if let Some ( base) = self . ip_network . strip_suffix ( ".x" ) {
349- base
350- } else if let Some ( base) = self . ip_network . strip_suffix ( ".0/24" ) {
351- base
352- } else {
353- return Err ( ConfigError :: validation ( format ! (
354- "Cannot derive static reservations from IP network: {}" ,
355- self . ip_network
356- ) ) ) ;
357- } ;
335+ let base = self . network_base ( ) ?;
358336
359337 // Generate department-specific static reservations
360338 let department = self
@@ -1041,26 +1019,26 @@ mod tests {
10411019 assert ! ( config. dhcp_range_start( ) . is_err( ) ) ;
10421020 assert ! ( config. dhcp_range_end( ) . is_err( ) ) ;
10431021
1044- // Test specific error messages
1022+ // All methods delegate to network_base(), which returns a unified error
10451023 let gateway_error = config. gateway_ip ( ) . unwrap_err ( ) ;
10461024 assert ! (
10471025 gateway_error
10481026 . to_string( )
1049- . contains( "Cannot derive gateway from IP network: invalid.network" )
1027+ . contains( "Cannot parse base from IP network: invalid.network" )
10501028 ) ;
10511029
10521030 let dhcp_start_error = config. dhcp_range_start ( ) . unwrap_err ( ) ;
10531031 assert ! (
10541032 dhcp_start_error
10551033 . to_string( )
1056- . contains( "Cannot derive DHCP range from IP network: invalid.network" )
1034+ . contains( "Cannot parse base from IP network: invalid.network" )
10571035 ) ;
10581036
10591037 let dhcp_end_error = config. dhcp_range_end ( ) . unwrap_err ( ) ;
10601038 assert ! (
10611039 dhcp_end_error
10621040 . to_string( )
1063- . contains( "Cannot derive DHCP range from IP network: invalid.network" )
1041+ . contains( "Cannot parse base from IP network: invalid.network" )
10641042 ) ;
10651043 }
10661044
0 commit comments