2025-07-07 19:33:31 +00:00
|
|
|
use crate::{
|
|
|
|
|
Result,
|
|
|
|
|
sharry::{AliasID, FileID, ShareID, Uri},
|
|
|
|
|
};
|
2025-07-07 16:26:10 +00:00
|
|
|
|
2025-07-07 19:40:56 +00:00
|
|
|
const VALID_URI: &str = "scheme://valid.uri";
|
|
|
|
|
const VALID_ALIAS: &str = "valid-alias";
|
|
|
|
|
const VALID_SHARE: &str = "valid-share";
|
|
|
|
|
const VALID_FILE: &str = "valid-file";
|
2025-07-07 16:26:10 +00:00
|
|
|
|
2025-07-07 19:33:31 +00:00
|
|
|
pub trait CheckID {
|
|
|
|
|
fn check(self) -> Result<()>;
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
|
2025-07-07 19:33:31 +00:00
|
|
|
impl CheckID for (&Uri, &AliasID) {
|
|
|
|
|
fn check(self) -> Result<()> {
|
|
|
|
|
if self.0.to_string() != VALID_URI {
|
|
|
|
|
Err(self.0.into())
|
|
|
|
|
} else if self.1.as_ref() != VALID_ALIAS {
|
|
|
|
|
Err(self.1.into())
|
|
|
|
|
} else {
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-07 19:33:31 +00:00
|
|
|
impl CheckID for &ShareID {
|
|
|
|
|
fn check(self) -> Result<()> {
|
2025-07-07 19:40:56 +00:00
|
|
|
if self.to_string() == VALID_SHARE {
|
2025-07-07 19:33:31 +00:00
|
|
|
Ok(())
|
2025-07-07 19:40:56 +00:00
|
|
|
} else {
|
|
|
|
|
Err(self.into())
|
2025-07-07 19:33:31 +00:00
|
|
|
}
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-07 19:33:31 +00:00
|
|
|
impl CheckID for (&ShareID, &FileID) {
|
|
|
|
|
fn check(self) -> Result<()> {
|
|
|
|
|
self.0.check()?;
|
2025-07-07 16:26:10 +00:00
|
|
|
|
2025-07-07 19:40:56 +00:00
|
|
|
if self.1.to_string() == VALID_FILE {
|
2025-07-07 19:33:31 +00:00
|
|
|
Ok(())
|
2025-07-07 19:40:56 +00:00
|
|
|
} else {
|
|
|
|
|
Err(self.1.into())
|
2025-07-07 19:33:31 +00:00
|
|
|
}
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn make_invalid(valid: &str) -> String {
|
|
|
|
|
let invalid = valid.replace("valid", "invalid");
|
|
|
|
|
assert_ne!(valid, invalid);
|
|
|
|
|
|
|
|
|
|
invalid
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<bool> for Uri {
|
|
|
|
|
fn from(value: bool) -> Self {
|
2025-07-07 19:40:56 +00:00
|
|
|
if value {
|
|
|
|
|
Self::from(VALID_URI.to_string())
|
|
|
|
|
} else {
|
|
|
|
|
Self::from(make_invalid(VALID_URI))
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<bool> for AliasID {
|
|
|
|
|
fn from(value: bool) -> Self {
|
2025-07-07 19:40:56 +00:00
|
|
|
if value {
|
|
|
|
|
Self::from(VALID_ALIAS.to_string())
|
|
|
|
|
} else {
|
|
|
|
|
Self::from(make_invalid(VALID_ALIAS))
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<bool> for ShareID {
|
|
|
|
|
fn from(value: bool) -> Self {
|
2025-07-07 19:40:56 +00:00
|
|
|
if value {
|
|
|
|
|
Self::from(VALID_SHARE.to_string())
|
|
|
|
|
} else {
|
|
|
|
|
Self::from(make_invalid(VALID_SHARE))
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<bool> for FileID {
|
|
|
|
|
fn from(value: bool) -> Self {
|
2025-07-07 19:40:56 +00:00
|
|
|
if value {
|
|
|
|
|
Self::new_test(VALID_FILE)
|
|
|
|
|
} else {
|
|
|
|
|
Self::new_test(make_invalid(VALID_FILE))
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
use crate::Parameter;
|
|
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn true_makes_valids() {
|
2025-07-07 19:33:31 +00:00
|
|
|
let uri = Uri::from(true);
|
|
|
|
|
let alias_id = AliasID::from(true);
|
|
|
|
|
let share_id = ShareID::from(true);
|
|
|
|
|
let file_id = FileID::from(true);
|
|
|
|
|
|
|
|
|
|
assert!(matches!((&uri, &alias_id).check(), Ok(())));
|
|
|
|
|
assert!(matches!(share_id.check(), Ok(())));
|
|
|
|
|
assert!(matches!((&share_id, &file_id).check(), Ok(())));
|
2025-07-07 16:26:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn false_makes_invalids() {
|
2025-07-07 19:33:31 +00:00
|
|
|
let uri = Uri::from(true);
|
|
|
|
|
let alias_id = AliasID::from(true);
|
|
|
|
|
let share_id = ShareID::from(true);
|
|
|
|
|
let file_id = FileID::from(true);
|
|
|
|
|
|
|
|
|
|
let uri_i = Uri::from(false);
|
|
|
|
|
let alias_id_i = AliasID::from(false);
|
|
|
|
|
let share_id_i = ShareID::from(false);
|
|
|
|
|
let file_id_i = FileID::from(false);
|
2025-07-07 16:26:10 +00:00
|
|
|
|
|
|
|
|
// invalid Uri, valid alias
|
2025-07-07 19:33:31 +00:00
|
|
|
let check = (&uri_i, &alias_id).check().expect_err("should be invalid");
|
2025-07-07 16:26:10 +00:00
|
|
|
let p = check.get_invalid_param().expect("should be InvalidParam");
|
|
|
|
|
assert!(matches!(p, Parameter::Uri(_)));
|
|
|
|
|
|
|
|
|
|
// valid Uri, invalid alias
|
2025-07-07 19:33:31 +00:00
|
|
|
let check = (&uri, &alias_id_i).check().expect_err("should be invalid");
|
2025-07-07 16:26:10 +00:00
|
|
|
let p = check.get_invalid_param().expect("should be InvalidParam");
|
|
|
|
|
assert!(matches!(p, Parameter::AliasID(_)));
|
|
|
|
|
|
|
|
|
|
// invalid share
|
2025-07-07 19:33:31 +00:00
|
|
|
let check = share_id_i.check().expect_err("should be invalid");
|
2025-07-07 16:26:10 +00:00
|
|
|
let p = check.get_invalid_param().expect("should be InvalidParam");
|
|
|
|
|
assert!(matches!(p, Parameter::ShareID(_)));
|
|
|
|
|
|
|
|
|
|
// invalid share, valid file
|
2025-07-07 19:33:31 +00:00
|
|
|
let check = (&share_id_i, &file_id)
|
|
|
|
|
.check()
|
|
|
|
|
.expect_err("should be invalid");
|
2025-07-07 16:26:10 +00:00
|
|
|
let p = check.get_invalid_param().expect("should be InvalidParam");
|
|
|
|
|
assert!(matches!(p, Parameter::ShareID(_)));
|
|
|
|
|
|
|
|
|
|
// valid share, invalid file
|
2025-07-07 19:33:31 +00:00
|
|
|
let check = (&share_id, &file_id_i)
|
|
|
|
|
.check()
|
|
|
|
|
.expect_err("should be invalid");
|
2025-07-07 16:26:10 +00:00
|
|
|
let p = check.get_invalid_param().expect("should be InvalidParam");
|
|
|
|
|
assert!(matches!(p, Parameter::FileID(_)));
|
|
|
|
|
}
|
|
|
|
|
}
|