noodles_refget/sequence/
service.rsmod builder;
pub use self::builder::Builder;
use std::num::NonZeroU32;
use serde::{Deserialize, Deserializer};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct Service {
circular_supported: bool,
algorithms: Vec<String>,
identifier_types: Vec<String>,
#[serde(deserialize_with = "deserialize_subsequence_limit")]
subsequence_limit: Option<NonZeroU32>,
}
impl Service {
pub fn circular_supported(&self) -> bool {
self.circular_supported
}
pub fn algorithms(&self) -> &[String] {
&self.algorithms
}
pub fn identifier_types(&self) -> &[String] {
&self.identifier_types
}
pub fn subsequence_limit(&self) -> Option<NonZeroU32> {
self.subsequence_limit
}
}
fn deserialize_subsequence_limit<'de, D>(deserializer: D) -> Result<Option<NonZeroU32>, D::Error>
where
D: Deserializer<'de>,
{
let value: Option<u32> = Deserialize::deserialize(deserializer)?;
match value {
Some(n) => Ok(NonZeroU32::new(n)),
None => Ok(None),
}
}
#[cfg(test)]
mod tests {
use serde_test::{assert_de_tokens, Token};
use super::*;
#[test]
fn test_deserialize_subsequence_limit() {
#[derive(Debug, Deserialize, Eq, PartialEq)]
#[serde(transparent)]
struct SubsequenceLimit(
#[serde(deserialize_with = "deserialize_subsequence_limit")] Option<NonZeroU32>,
);
assert_de_tokens(
&SubsequenceLimit(NonZeroU32::new(8)),
&[Token::Some, Token::I64(8)],
);
assert_de_tokens(&SubsequenceLimit(None), &[Token::Some, Token::I64(0)]);
assert_de_tokens(&SubsequenceLimit(None), &[Token::None]);
}
}