1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use super::{Error, Result};
use kct_helper::io;
use semver::Version;
use serde_json::Value;
use std::convert::TryFrom;
use std::path::PathBuf;
#[derive(Debug)]
pub struct Spec {
pub name: String,
pub version: Version,
}
impl TryFrom<PathBuf> for Spec {
type Error = Error;
fn try_from(path: PathBuf) -> Result<Spec> {
match io::from_file(&path) {
Ok(contents) => {
let json: Value =
serde_json::from_str(&contents).map_err(|_err| Error::InvalidSpec)?;
let name = json
.get("name")
.and_then(|v| v.as_str())
.map(|v| Ok(String::from(v)))
.unwrap_or(Err(Error::InvalidSpec))?;
let version = json
.get("version")
.and_then(|v| v.as_str())
.map(|v| Version::parse(v).map_err(|_err| Error::InvalidSpec))
.unwrap_or(Err(Error::InvalidSpec))?;
Ok(Spec { name, version })
}
_ => Err(Error::InvalidSpec),
}
}
}