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
use std::str::FromStr;

use fastobo::ast::Synonym;
use fastobo::ast::SynonymScope;
use fastobo::ast::Ident;
use fastobo::ast::Xref;
use fastobo::ast::XrefList;
use fastobo::ast::QuotedString;

use crate::model::SynonymPropertyValue;
use crate::error::Error;
use crate::error::Result;
use super::FromGraph;

impl FromGraph<SynonymPropertyValue> for Synonym {
    fn from_graph(pv: SynonymPropertyValue) -> Result<Self> {
        let desc = QuotedString::new(pv.val);
        let scope = match pv.pred.as_str() {
            "hasBroadSynonym" => SynonymScope::Broad,
            "hasExactSynonym" => SynonymScope::Exact,
            "hasNarrowSynonym" => SynonymScope::Narrow,
            "hasRelatedSynonym" => SynonymScope::Related,
            other => return Err(Error::InvalidSynonymType(other.to_string())),
        };
        let xrefs = pv.xrefs
            .into_iter()
            .map(|id| Ident::from_str(&id).map(Xref::new).map_err(Error::from))
            .collect::<Result<XrefList>>()?;
        Ok(Synonym::with_xrefs(desc, scope, xrefs))
    }
}