repo_cli/query/
inner.rs

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}