nyar_wasm/symbols/wasi_publisher/
convert.rs

1use std::str::FromStr;
2
3use nyar_error::SyntaxError;
4
5use super::*;
6
7// impl Default for WasiModule {
8//     fn default() -> Self {
9//         Self { package: None, name: Arc::from(""), version: None }
10//     }
11// }
12
13impl From<&str> for WasiModule {
14    fn from(value: &str) -> Self {
15        Self { name: value.into(), package: None, version: None }
16    }
17}
18
19impl From<String> for WasiModule {
20    fn from(value: String) -> Self {
21        Self { name: value.into(), package: None, version: None }
22    }
23}
24
25impl From<Arc<str>> for WasiModule {
26    fn from(value: Arc<str>) -> Self {
27        Self { name: value.into(), package: None, version: None }
28    }
29}
30
31impl FromStr for WasiModule {
32    type Err = SyntaxError;
33
34    /// `wasi:random/random@0.2.0`
35    /// `wasi:random/random`
36    /// `random`
37    fn from_str(s: &str) -> Result<Self, SyntaxError> {
38        match s.split_once('/') {
39            Some((package, module)) => {
40                let (module, version) = match module.split_once('@') {
41                    Some((module, version)) => match Version::parse(version) {
42                        Ok(version) => (module, Some(version)),
43                        Err(_) => return Err(SyntaxError::new("Invalid semver version")),
44                    },
45                    None => (module, None),
46                };
47                match package.split_once(':') {
48                    Some((organization, project)) => Ok(Self {
49                        name: Arc::from(module),
50                        package: Some(WasiPublisher { organization: Arc::from(organization), project: Arc::from(project) }),
51                        version,
52                    }),
53                    None => Err(SyntaxError::new("Missing organization name")),
54                }
55            }
56            None => Ok(Self { name: Arc::from(s), package: None, version: None }),
57        }
58    }
59}