Skip to main content

noodles_refget/sequence/
service.rs

1mod builder;
2
3pub use self::builder::Builder;
4
5use std::num::NonZeroU32;
6
7use serde::{Deserialize, Deserializer};
8
9/// Service information.
10#[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    /// Returns whether circular genomes are supported by the server.
21    pub fn circular_supported(&self) -> bool {
22        self.circular_supported
23    }
24
25    /// Returns a list of digest algorithms supported by the server.
26    pub fn algorithms(&self) -> &[String] {
27        &self.algorithms
28    }
29
30    /// Returns a list of supported sequence type identifiers.
31    pub fn identifier_types(&self) -> &[String] {
32        &self.identifier_types
33    }
34
35    /// Returns the maximum length of an interval.
36    ///
37    /// If missing, there is no limit.
38    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}