diff options
Diffstat (limited to 'src/target.rs')
| -rw-r--r-- | src/target.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/target.rs b/src/target.rs new file mode 100644 index 0000000..2752097 --- /dev/null +++ b/src/target.rs @@ -0,0 +1,42 @@ +use std::path::PathBuf; +use std::str::FromStr; +use std::string::ParseError; + +use url::{self,Url}; +use serde_derive::Serialize; + + +#[derive(Debug, Serialize)] +pub enum Target { + #[serde(serialize_with = "serialize_url")] + Url(Url), + Path(PathBuf), +} + +impl From<Url> for Target { + fn from(url: Url) -> Self { + Target::Url(url) + } +} + +impl From<PathBuf> for Target { + fn from(path: PathBuf) -> Self { + Target::Path(path) + } +} + + +impl FromStr for Target { + type Err = ParseError; + fn from_str(input: &str) -> Result<Self, Self::Err> { + Ok(match Url::parse(input) { + Ok(url) => url.into(), + Err(_) => PathBuf::from(input).into(), + }) + } +} + + +pub fn serialize_url<S>(url: &Url, serializer: S) -> Result<S::Ok, S::Error> where S: serde::ser::Serializer { + serializer.serialize_str(url.as_str()) +} |
