noodles_refget/sequence/
service.rs1mod builder;
2
3pub use self::builder::Builder;
4
5use std::num::NonZeroU32;
6
7use serde::{Deserialize, Deserializer};
8
9#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
11pub struct Service {
12 circular_supported: bool,
13 algorithms: Vec<String>,
14 identifier_types: Vec<String>,
15 #[serde(deserialize_with = "deserialize_subsequence_limit")]
16 subsequence_limit: Option<NonZeroU32>,
17}
18
19impl Service {
20 pub fn circular_supported(&self) -> bool {
22 self.circular_supported
23 }
24
25 pub fn algorithms(&self) -> &[String] {
27 &self.algorithms
28 }
29
30 pub fn identifier_types(&self) -> &[String] {
32 &self.identifier_types
33 }
34
35 pub fn subsequence_limit(&self) -> Option<NonZeroU32> {
39 self.subsequence_limit
40 }
41}
42
43fn deserialize_subsequence_limit<'de, D>(deserializer: D) -> Result<Option<NonZeroU32>, D::Error>
44where
45 D: Deserializer<'de>,
46{
47 let value: Option<u32> = Deserialize::deserialize(deserializer)?;
48
49 match value {
50 Some(n) => Ok(NonZeroU32::new(n)),
51 None => Ok(None),
52 }
53}
54
55#[cfg(test)]
56mod tests {
57 use serde_test::{Token, assert_de_tokens};
58
59 use super::*;
60
61 #[test]
62 fn test_deserialize_subsequence_limit() {
63 #[derive(Debug, Deserialize, Eq, PartialEq)]
64 #[serde(transparent)]
65 struct SubsequenceLimit(
66 #[serde(deserialize_with = "deserialize_subsequence_limit")] Option<NonZeroU32>,
67 );
68
69 assert_de_tokens(
70 &SubsequenceLimit(NonZeroU32::new(8)),
71 &[Token::Some, Token::I64(8)],
72 );
73 assert_de_tokens(&SubsequenceLimit(None), &[Token::Some, Token::I64(0)]);
74 assert_de_tokens(&SubsequenceLimit(None), &[Token::None]);
75 }
76}