diff --git a/src/appstate.rs b/src/appstate.rs index db76e68..b3a080a 100644 --- a/src/appstate.rs +++ b/src/appstate.rs @@ -9,7 +9,7 @@ use crate::{ error, file::{Chunk, FileTrait}, output::new_progressbar, - sharry::Client, + sharry::{Client, ShareID}, }; pub struct AppState { @@ -33,7 +33,7 @@ fn new_http(args: &Cli) -> ureq::Agent { .into() } -fn new_share(args: &Cli) -> error::Result { +fn new_share(args: &Cli) -> error::Result { new_http(args).share_create(&args.get_uri(), &args.alias, args.get_share_request()) } diff --git a/src/cachefile.rs b/src/cachefile.rs index 9d0dba3..6ce65bd 100644 --- a/src/cachefile.rs +++ b/src/cachefile.rs @@ -15,7 +15,7 @@ use crate::{ error, file::{self, Chunk, FileTrait}, output::new_progressbar, - sharry::{Client, Uri}, + sharry::{AliasID, Client, ShareID, Uri}, }; #[derive(Serialize, Deserialize, Debug)] @@ -24,8 +24,8 @@ pub struct CacheFile { file_name: PathBuf, uri: Uri, - alias_id: String, - share_id: String, + alias_id: AliasID, + share_id: ShareID, uploading: Option, files: VecDeque, @@ -98,7 +98,7 @@ impl CacheFile { pub fn from_args( args: &Cli, - new_share: impl FnOnce(&Cli) -> error::Result, + new_share: impl FnOnce(&Cli) -> error::Result, ) -> error::Result { let mut files = args.files.clone(); diff --git a/src/cli.rs b/src/cli.rs index 491be5d..5b5f3c8 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -11,7 +11,7 @@ use log::LevelFilter; use crate::{ file::{Checked, FileTrait}, - sharry::{NewShareRequest, Uri}, + sharry::{AliasID, NewShareRequest, Uri}, }; #[derive(Parser)] @@ -69,7 +69,7 @@ pub struct Cli { url: String, /// ID of a public alias to use - pub alias: String, + pub alias: AliasID, /// Files to upload to the new share #[arg(value_name = "FILE", required = true, value_parser = parse_sharry_file)] @@ -159,7 +159,7 @@ impl Cli { let mut hasher = Blake2b::new().hash_length(16).to_state(); hasher.update(self.get_uri().as_ref()); - hasher.update(self.alias.as_bytes()); + hasher.update(self.alias.as_ref()); for chk in sorted(&self.files) { hasher.update(chk.as_ref()); diff --git a/src/error.rs b/src/error.rs index ffbe246..d708d96 100644 --- a/src/error.rs +++ b/src/error.rs @@ -8,10 +8,10 @@ pub enum Parameter { Uri(String), #[error("given Alias ID {0:?}")] - AliasID(String), + AliasID(sharry::AliasID), #[error("stored Share ID {0:?}")] - ShareID(String), + ShareID(sharry::ShareID), #[error("stored {0:?}")] FileID(sharry::FileID), diff --git a/src/file/checked.rs b/src/file/checked.rs index 92e9ef7..e5c8fc5 100644 --- a/src/file/checked.rs +++ b/src/file/checked.rs @@ -76,8 +76,8 @@ impl Checked { self, client: &impl sharry::Client, uri: &sharry::Uri, - alias_id: &str, - share_id: &str, + alias_id: &sharry::AliasID, + share_id: &sharry::ShareID, ) -> error::Result { let file_id = client.file_create(uri, alias_id, share_id, &self)?; diff --git a/src/impl_ureq.rs b/src/impl_ureq.rs index 0a2721c..2e50a8b 100644 --- a/src/impl_ureq.rs +++ b/src/impl_ureq.rs @@ -3,13 +3,13 @@ use log::{debug, trace}; use crate::{ error, file::{self, FileTrait}, - sharry::{self, FileID, Uri}, + sharry::{self, AliasID, FileID, ShareID, Uri}, }; fn find_cause( uri: &Uri, - alias_id: &str, - share_id: Option<&str>, + alias_id: &AliasID, + share_id: Option<&ShareID>, file_id: Option<&FileID>, ) -> impl FnOnce(ureq::Error) -> error::Error { move |error| match error { @@ -22,7 +22,7 @@ fn find_cause( trace!("HTTP Error 404: Share and/or file may have been deleted!"); if let Some(file_id) = file_id { - error::Error::InvalidParameter(error::Parameter::FileID(file_id.clone())) + error::Error::InvalidParameter(error::Parameter::FileID(file_id.to_owned())) } else if let Some(share_id) = share_id { error::Error::InvalidParameter(error::Parameter::ShareID(share_id.to_owned())) } else { @@ -50,15 +50,15 @@ impl sharry::Client for ureq::Agent { fn share_create( &self, uri: &Uri, - alias_id: &str, + alias_id: &AliasID, data: sharry::NewShareRequest, - ) -> error::Result { + ) -> error::Result { let res = { let endpoint = uri.share_create(); let mut res = self .post(&endpoint) - .header("Sharry-Alias", alias_id) + .header("Sharry-Alias", alias_id.as_ref()) .send_json(data) .map_err(find_cause(uri, alias_id, None, None))?; @@ -75,19 +75,19 @@ impl sharry::Client for ureq::Agent { if res.success && (res.message == "Share created.") { trace!("new share id: {:?}", res.id); - Ok(res.id) + Ok(res.id.into()) } else { Err(error::Error::response(format!("{res:?}"))) } } - fn share_notify(&self, uri: &Uri, alias_id: &str, share_id: &str) -> error::Result<()> { + fn share_notify(&self, uri: &Uri, alias_id: &AliasID, share_id: &ShareID) -> error::Result<()> { let res = { let endpoint = uri.share_notify(share_id); let mut res = self .post(&endpoint) - .header("Sharry-Alias", alias_id) + .header("Sharry-Alias", alias_id.as_ref()) .send_empty() .map_err(find_cause(uri, alias_id, Some(share_id), None))?; @@ -107,8 +107,8 @@ impl sharry::Client for ureq::Agent { fn file_create( &self, uri: &Uri, - alias_id: &str, - share_id: &str, + alias_id: &AliasID, + share_id: &ShareID, file: &file::Checked, ) -> error::Result { let res = { @@ -116,7 +116,7 @@ impl sharry::Client for ureq::Agent { let res = self .post(&endpoint) - .header("Sharry-Alias", alias_id) + .header("Sharry-Alias", alias_id.as_ref()) .header("Sharry-File-Name", file.get_name()) .header("Upload-Length", file.get_size()) .send_empty() @@ -139,8 +139,8 @@ impl sharry::Client for ureq::Agent { fn file_patch( &self, uri: &Uri, - alias_id: &str, - share_id: &str, + alias_id: &AliasID, + share_id: &ShareID, chunk: &file::Chunk, ) -> error::Result<()> { let res = { @@ -148,7 +148,7 @@ impl sharry::Client for ureq::Agent { let res = self .patch(&endpoint) - .header("Sharry-Alias", alias_id) + .header("Sharry-Alias", alias_id.as_ref()) .header("Upload-Offset", chunk.get_offset()) .send(chunk.get_data()) .map_err(find_cause( diff --git a/src/sharry/api/id.rs b/src/sharry/api/id.rs index a951f82..cd4d6a3 100644 --- a/src/sharry/api/id.rs +++ b/src/sharry/api/id.rs @@ -6,8 +6,41 @@ use serde::{Deserialize, Serialize}; use crate::error; -// pub struct AliasID(String); -// pub struct ShareID(String); +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AliasID(String); + +impl fmt::Display for AliasID { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.0) + } +} + +impl AsRef<[u8]> for AliasID { + fn as_ref(&self) -> &[u8] { + self.0.as_bytes() + } +} + +impl From for AliasID { + fn from(value: String) -> Self { + Self(value) + } +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ShareID(String); + +impl fmt::Display for ShareID { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.0) + } +} + +impl From for ShareID { + fn from(value: String) -> Self { + Self(value) + } +} #[derive(Serialize, Deserialize, Debug, Clone)] pub struct FileID(String); diff --git a/src/sharry/api/mod.rs b/src/sharry/api/mod.rs index 5e17abf..b272b6b 100644 --- a/src/sharry/api/mod.rs +++ b/src/sharry/api/mod.rs @@ -2,6 +2,6 @@ mod id; mod json; mod uri; -pub use id::FileID; +pub use id::{AliasID, FileID, ShareID}; pub use json::{NewShareRequest, NewShareResponse, NotifyShareResponse}; pub use uri::Uri; diff --git a/src/sharry/api/uri.rs b/src/sharry/api/uri.rs index e3c0c5f..ea3e647 100644 --- a/src/sharry/api/uri.rs +++ b/src/sharry/api/uri.rs @@ -33,15 +33,15 @@ impl Uri { self.endpoint(format_args!("alias/upload/new")) } - pub fn share_notify(&self, share_id: &str) -> String { + pub fn share_notify(&self, share_id: &super::ShareID) -> String { self.endpoint(format_args!("alias/mail/notify/{share_id}")) } - pub fn file_create(&self, share_id: &str) -> String { + pub fn file_create(&self, share_id: &super::ShareID) -> String { self.endpoint(format_args!("alias/upload/{share_id}/files/tus")) } - pub fn file_patch(&self, share_id: &str, file_id: &super::FileID) -> String { + pub fn file_patch(&self, share_id: &super::ShareID, file_id: &super::FileID) -> String { self.endpoint(format_args!("alias/upload/{share_id}/files/tus/{file_id}")) } } diff --git a/src/sharry/client.rs b/src/sharry/client.rs index 8d45f40..5cf3e30 100644 --- a/src/sharry/client.rs +++ b/src/sharry/client.rs @@ -1,30 +1,33 @@ use crate::{error, file}; -use super::api::{FileID, NewShareRequest, Uri}; +use super::{ + AliasID, ShareID, + api::{FileID, NewShareRequest, Uri}, +}; pub trait Client { fn share_create( &self, uri: &Uri, - alias_id: &str, + alias_id: &AliasID, data: NewShareRequest, - ) -> error::Result; + ) -> error::Result; - fn share_notify(&self, uri: &Uri, alias_id: &str, share_id: &str) -> error::Result<()>; + fn share_notify(&self, uri: &Uri, alias_id: &AliasID, share_id: &ShareID) -> error::Result<()>; fn file_create( &self, uri: &Uri, - alias_id: &str, - share_id: &str, + alias_id: &AliasID, + share_id: &ShareID, file: &file::Checked, ) -> error::Result; fn file_patch( &self, uri: &Uri, - alias_id: &str, - share_id: &str, + alias_id: &AliasID, + share_id: &ShareID, chunk: &file::Chunk, ) -> error::Result<()>; } diff --git a/src/sharry/mod.rs b/src/sharry/mod.rs index a37d19c..8b53aca 100644 --- a/src/sharry/mod.rs +++ b/src/sharry/mod.rs @@ -1,5 +1,7 @@ mod api; mod client; -pub use api::{FileID, NewShareRequest, NewShareResponse, NotifyShareResponse, Uri}; +pub use api::{ + AliasID, FileID, NewShareRequest, NewShareResponse, NotifyShareResponse, ShareID, Uri, +}; pub use client::Client;