nyar_wasm/symbols/wasi_publisher/
convert.rs1use std::str::FromStr;
2
3use nyar_error::SyntaxError;
4
5use super::*;
6
7impl 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 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}