aboutsummaryrefslogtreecommitdiffstats
path: root/src/target.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/target.rs')
-rw-r--r--src/target.rs42
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())
+}