starlane_core/resource/
selector.rs

1use std::str::FromStr;
2
3use nom::error::VerboseError;
4use nom::IResult;
5
6use starlane_resources::{FieldSelection, parse_kind, ResourceSelector};
7
8use crate::error::Error;
9use crate::resource::ResourceType;
10
11type Res<T, U> = IResult<T, U, VerboseError<T>>;
12
13pub struct MultiResourceSelector {
14    pub rt: ResourceType,
15}
16
17impl Into<ResourceSelector> for MultiResourceSelector {
18    fn into(self) -> ResourceSelector {
19        let mut selector = ResourceSelector::new();
20        selector.add_field(FieldSelection::Type(self.rt));
21        selector
22    }
23}
24
25/*
26fn resource_type( input: &str ) -> Res<&str,Result<ResourceType,Error>> {
27    context( "resource_type",
28       delimited( tag("<"), alpha1, tag(">")  )
29    )(input).map( |(next_input, mut res )|{
30        (next_input,ResourceType::from_str(res))
31    })
32}
33
34 */
35
36impl FromStr for MultiResourceSelector {
37    type Err = Error;
38
39    fn from_str(s: &str) -> Result<Self, Self::Err> {
40        let (leftover, parts) = parse_kind(s)?;
41
42        if !leftover.is_empty() {
43            return Err(format!("unexpected leftover '{}' when parsing '{}'", leftover, s).into());
44        }
45        let resource_type = ResourceType::from_str(parts.resource_type.as_str())?;
46
47        Ok(MultiResourceSelector { rt: resource_type })
48    }
49}
50
51#[cfg(test)]
52mod test {
53    use std::str::FromStr;
54
55    use crate::error::Error;
56    use crate::resource::selector::MultiResourceSelector;
57
58    #[test]
59    pub fn test() -> Result<(), Error> {
60        MultiResourceSelector::from_str("<SubSpace>")?;
61
62        Ok(())
63    }
64}