pub use crate::{
client::{
Client,
ClientVersion,
ClientEncryptArg,
ClientDecryptResultSuccess,
ClientDecryptResultFailure,
V1Client,
V2Client,
},
util::Analyzer,
};
use std::rc::Rc;
use chrono::{
DateTime,
FixedOffset,
};
#[allow(unused)]
pub struct VersionSelectorClient {
analyzer: Rc<dyn Analyzer>,
v1_client: Rc<dyn Client>,
v2_client: Rc<dyn Client>,
}
impl VersionSelectorClient {
#[allow(unused)]
pub fn new(analyzer: Rc<dyn Analyzer>, v1_client: Rc<dyn Client>, v2_client: Rc<dyn Client>) -> VersionSelectorClient {
return VersionSelectorClient {
analyzer,
v1_client,
v2_client,
};
}
pub fn get_analyzer(&self) -> &Rc<dyn Analyzer> {
return &self.analyzer;
}
}
impl Client for VersionSelectorClient {
fn encrypt(&self, args: &ClientEncryptArg)
->
Result<String, String> {
if args.hint.len() > 0 {
self.v2_client.encrypt(args)
} else {
self.v1_client.encrypt(args)
}
}
fn decrypt(
&self,
ciphertext: &str
)
->
Result<ClientDecryptResultSuccess, ClientDecryptResultFailure> {
let result = self.get_analyzer()
.get_version(ciphertext);
if result.is_err() {
return Err(ClientDecryptResultFailure {
error_message: result.unwrap_err(),
hint: String::from(""),
});
}
let version = result.unwrap();
match version {
ClientVersion::V1 => return self.v1_client.decrypt(ciphertext),
ClientVersion::V2 => return self.v2_client.decrypt(ciphertext),
}
}
fn lockdate_from_snailcrypt_cipher(
&self,
ciphertext: &str
)
->
Result<DateTime<FixedOffset>, String> {
Ok(self.v1_client.lockdate_from_snailcrypt_cipher(ciphertext).unwrap())
}
fn get_datetime_format(&self) -> &str {
return self.v1_client.get_datetime_format();
}
fn get_client_version(&self) -> ClientVersion {
return self.v1_client.get_client_version();
}
}