use std::io::{Error, ErrorKind}; use rand::distr::Alphanumeric; use rand::RngExt; use lumiere_domain::configuration::port::ConfigurationPort; pub struct ConfigurationService { configuration_port: Box } impl ConfigurationService { pub fn new(configuration_repository: Box) -> Self { Self { configuration_port: configuration_repository } } pub fn create_initialisation_code(&self) -> Result<(), Error> { let initialisation_code = random_string(); self.configuration_port.save(initialisation_code) } pub fn get_initialisation_code(&self) -> Result, Error> { self.configuration_port.get_initialisation_code() .map_err(|database_error| Error::new( ErrorKind::Other, format!("Unable to retrieve the initialisation code… Cause: {}", database_error) )) } pub fn set_database_initialised(&self) -> Result<(), Error> { self.configuration_port.erase_initialisation_code() .map_err(|database_error| Error::new( ErrorKind::Other, format!("Unable to erase the initialisation code in database… Cause: {}", database_error) )) } } impl Clone for ConfigurationService { fn clone(&self) -> Self { ConfigurationService::new(self.configuration_port.clone()) } } fn random_string() -> String { let mut rng = rand::rng(); (0..10).map(|_| rng.sample(Alphanumeric) as char).collect() }