starlane_core/resource/
selector.rs1use 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
25impl 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}