1use crate::{
2 config::Config,
3 query::{AbbrevUrl, Query, ScpPath},
4};
5use anyhow::{anyhow, Error, Result};
6use std::str::FromStr;
7use url::Url;
8
9impl Query {
10 pub fn parse(s: &str) -> Result<Self> {
11 s.parse()
12 }
13
14 pub fn to_url(&self, config: &Config) -> Url {
15 match self {
16 Query::Url(url) => url.clone(),
17 Query::Scp(scp) => scp.to_url(),
18 Query::Abbrev(abbrev) => abbrev.to_url(config),
19 }
20 }
21}
22
23impl FromStr for Query {
24 type Err = Error;
25
26 fn from_str(s: &str) -> Result<Self> {
27 if let Ok(url) = Url::parse(s) {
28 match url.scheme() {
29 "http" | "https" | "git" | "ssh" => {}
30 scheme => return Err(anyhow!("'{}' is an invalid scheme", scheme)),
31 }
32
33 return Ok(Query::Url(url));
34 } else if let Ok(scp) = ScpPath::parse(s) {
35 return Ok(Query::Scp(scp));
36 } else if let Ok(abbrev) = AbbrevUrl::parse(s) {
37 return Ok(Query::Abbrev(abbrev));
38 }
39 Err(anyhow!("'{}' invalid query not url or scp path", s))
40 }
41}