diff options
| -rw-r--r-- | src/auth.rs | 58 | 
1 files changed, 39 insertions, 19 deletions
| diff --git a/src/auth.rs b/src/auth.rs index c772faf..8d97063 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -164,6 +164,38 @@ where      };  } +fn authenticate_user_wrapper<T, C>( +    device: T, +    constructor: C, +    password: &str, +) -> Result<User<DeviceWrapper>, (DeviceWrapper, CommandError)> +where +    T: Device, +    C: Fn(T) -> DeviceWrapper, +{ +    let result = device.authenticate_user(password); +    match result { +        Ok(user) => Ok(User::new(constructor(user.device), user.temp_password)), +        Err((device, err)) => Err((constructor(device), err)), +    } +} + +fn authenticate_admin_wrapper<T, C>( +    device: T, +    constructor: C, +    password: &str, +) -> Result<Admin<DeviceWrapper>, (DeviceWrapper, CommandError)> +where +    T: Device, +    C: Fn(T) -> DeviceWrapper, +{ +    let result = device.authenticate_admin(password); +    match result { +        Ok(user) => Ok(Admin::new(constructor(user.device), user.temp_password)), +        Err((device, err)) => Err((constructor(device), err)), +    } +} +  impl<T: Device> User<T> {      /// Forgets the user authentication and returns an unauthenticated device.  This method      /// consumes the authenticated device.  It does not perform any actual commands on the @@ -343,32 +375,20 @@ impl<T: Device> AuthenticatedDevice<T> for Admin<T> {  impl Authenticate for DeviceWrapper {      fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, CommandError)> {          match self { -            DeviceWrapper::Storage(_) => panic!("..."), -            DeviceWrapper::Pro(pro) => { -                let result = pro.authenticate_user(password); -                match result { -                    Ok(user) => Ok(User::new( -                        DeviceWrapper::Pro(user.device), -                        user.temp_password, -                    )), -                    Err((pro, err)) => Err((DeviceWrapper::Pro(pro), err)), -                } +            DeviceWrapper::Storage(storage) => { +                authenticate_user_wrapper(storage, DeviceWrapper::Storage, password)              } +            DeviceWrapper::Pro(pro) => authenticate_user_wrapper(pro, DeviceWrapper::Pro, password),          }      }      fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, CommandError)> {          match self { -            DeviceWrapper::Storage(_) => panic!("..."), +            DeviceWrapper::Storage(storage) => { +                authenticate_admin_wrapper(storage, DeviceWrapper::Storage, password) +            }              DeviceWrapper::Pro(pro) => { -                let result = pro.authenticate_admin(password); -                match result { -                    Ok(admin) => Ok(Admin::new( -                        DeviceWrapper::Pro(admin.device), -                        admin.temp_password, -                    )), -                    Err((pro, err)) => Err((DeviceWrapper::Pro(pro), err)), -                } +                authenticate_admin_wrapper(pro, DeviceWrapper::Pro, password)              }          }      } | 
