diff --git a/pica-record/src/level.rs b/pica-record/src/level.rs new file mode 100644 index 000000000..a65fc48c7 --- /dev/null +++ b/pica-record/src/level.rs @@ -0,0 +1,46 @@ +use std::str::FromStr; + +use thiserror::Error; + +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub enum Level { + #[default] + Main, + Local, + Copy, +} + +/// An error that can occur when parsing PICA+ level. +#[derive(Error, PartialEq, Eq, Debug)] +#[error("{0}")] +pub struct ParseLevelError(String); + +impl FromStr for Level { + type Err = ParseLevelError; + + fn from_str(s: &str) -> Result { + match s { + "main" => Ok(Self::Main), + "local" => Ok(Self::Local), + "copy" => Ok(Self::Copy), + _ => Err(ParseLevelError(format!("invalid level '{}'", s))), + } + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn test_from_str() -> anyhow::Result<()> { + assert_eq!("main".parse::().unwrap(), Level::Main); + assert_eq!("local".parse::().unwrap(), Level::Local); + assert_eq!("copy".parse::().unwrap(), Level::Copy); + assert!("master".parse::().is_err()); + assert!("foo".parse::().is_err()); + + Ok(()) + } +} diff --git a/pica-record/src/lib.rs b/pica-record/src/lib.rs index d921b4128..fc82fd201 100644 --- a/pica-record/src/lib.rs +++ b/pica-record/src/lib.rs @@ -5,6 +5,7 @@ mod error; mod field; pub mod io; +mod level; mod occurrence; mod record; mod subfield; @@ -12,6 +13,7 @@ mod tag; pub use error::ParsePicaError; pub use field::{Field, FieldMut, FieldRef}; +pub use level::Level; pub use occurrence::{Occurrence, OccurrenceMut, OccurrenceRef}; pub use record::{ ByteRecord, Record, RecordMut, RecordRef, StringRecord,