add recipe_id, to deal with recipes in federated repos
This commit is contained in:
parent
196e9c17d8
commit
9e000e0202
2 changed files with 77 additions and 0 deletions
|
|
@ -4,3 +4,7 @@ pub use recipe::Recipe;
|
||||||
pub mod repo;
|
pub mod repo;
|
||||||
pub use repo::Repo;
|
pub use repo::Repo;
|
||||||
pub use repo::RepoLoadError;
|
pub use repo::RepoLoadError;
|
||||||
|
|
||||||
|
pub mod recipe_id;
|
||||||
|
pub use recipe_id::RecipeId;
|
||||||
|
pub use recipe_id::RecipeIdParseError;
|
||||||
|
|
|
||||||
73
tools/src/recipe_id.rs
Normal file
73
tools/src/recipe_id.rs
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct RecipeId {
|
||||||
|
pub repo: Option<String>,
|
||||||
|
pub recipe: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Error, PartialEq)]
|
||||||
|
pub enum RecipeIdParseError {
|
||||||
|
#[error("syntax error: {0}")]
|
||||||
|
SyntaxError(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for RecipeId {
|
||||||
|
type Err = RecipeIdParseError;
|
||||||
|
fn from_str(recipe_id: &str) -> Result<RecipeId, Self::Err> {
|
||||||
|
let substrings: Vec<&str> = recipe_id.split(':').collect();
|
||||||
|
match substrings.len() {
|
||||||
|
1 => Ok(RecipeId {
|
||||||
|
repo: None,
|
||||||
|
recipe: String::from(recipe_id),
|
||||||
|
}),
|
||||||
|
2 => Ok(RecipeId {
|
||||||
|
repo: Some(String::from(substrings[0])),
|
||||||
|
recipe: String::from(substrings[1]),
|
||||||
|
}),
|
||||||
|
_ => Err(RecipeIdParseError::SyntaxError(String::from(recipe_id))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod test {
|
||||||
|
#[cfg(test)]
|
||||||
|
use crate::recipe_id::{FromStr, RecipeId, RecipeIdParseError};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_simple() {
|
||||||
|
let r = RecipeId::from_str("hello");
|
||||||
|
assert_eq!(
|
||||||
|
r,
|
||||||
|
Ok(RecipeId {
|
||||||
|
repo: None,
|
||||||
|
recipe: "hello".into(),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_with_repo() {
|
||||||
|
let r = RecipeId::from_str("my_repo:my_recipe");
|
||||||
|
assert_eq!(
|
||||||
|
r,
|
||||||
|
Ok(RecipeId {
|
||||||
|
repo: Some("my_repo".into()),
|
||||||
|
recipe: "my_recipe".into(),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_too_many_colons() {
|
||||||
|
let r = RecipeId::from_str("my_repo:my_recipe:something_else");
|
||||||
|
assert_eq!(
|
||||||
|
r,
|
||||||
|
Err(RecipeIdParseError::SyntaxError(
|
||||||
|
"my_repo:my_recipe:something_else".into()
|
||||||
|
))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue