noodles_refget/sequence/
builder.rs1use noodles_core::region::Interval;
2
3use crate::{Client, Error, Sequence};
4
5pub struct Builder {
7 client: Client,
8 id: String,
9 interval: Option<Interval>,
10}
11
12impl Builder {
13 pub(crate) fn new<I>(client: Client, id: I) -> Self
14 where
15 I: Into<String>,
16 {
17 Self {
18 client,
19 id: id.into(),
20 interval: None,
21 }
22 }
23
24 pub fn set_interval<I>(mut self, interval: I) -> Self
26 where
27 I: Into<Interval>,
28 {
29 self.interval = Some(interval.into());
30 self
31 }
32
33 pub async fn send(self) -> crate::Result<Sequence> {
35 let endpoint = self
36 .client
37 .base_url()
38 .join(&format!("sequence/{}", self.id))
39 .map_err(Error::Url)?;
40
41 let mut request = self.client.http_client().get(endpoint);
42
43 if let Some(interval) = self.interval {
44 let mut query = Vec::new();
45
46 let (resolved_start, resolved_end) = resolve_interval(interval);
47
48 if let Some(start) = resolved_start {
49 query.push(("start", start.to_string()));
50 }
51
52 if let Some(end) = resolved_end {
53 query.push(("end", end.to_string()));
54 }
55
56 request = request.query(&query);
57 }
58
59 let response = request.send().await?.error_for_status()?;
60 let sequence = response.bytes().await?;
61
62 Ok(Sequence::new(self.client, self.id, sequence))
63 }
64}
65
66fn resolve_interval<I>(interval: I) -> (Option<usize>, Option<usize>)
67where
68 I: Into<Interval>,
69{
70 let interval = interval.into();
71 let start = interval.start().map(|position| usize::from(position) - 1);
72 let end = interval.end().map(usize::from);
73 (start, end)
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn test_resolve_interval() -> std::result::Result<(), noodles_core::position::TryFromIntError> {
82 use noodles_core::Position;
83
84 let start = Position::try_from(8)?;
85 let end = Position::try_from(13)?;
86
87 assert_eq!(resolve_interval(start..=end), (Some(7), Some(13)));
88 assert_eq!(resolve_interval(start..), (Some(7), None));
89 assert_eq!(resolve_interval(..=end), (None, Some(13)));
90 assert_eq!(resolve_interval(..), (None, None));
91
92 Ok(())
93 }
94}