phenopacket_builder/v2/
mod.rs

1mod core;
2mod phenopackets;
3
4use crate::{Build, Buildable, Set, Unset};
5
6use std::marker::PhantomData;
7
8#[derive(Debug, Default, Clone, PartialEq)]
9pub struct TimestampBuilder<T = Unset> {
10    timestamp: Option<prost_types::Timestamp>,
11    data: PhantomData<T>,
12}
13
14impl TimestampBuilder<Unset> {
15    /// Set seconds and nanoseconds to the timestamp.
16    ///
17    /// # Example
18    ///
19    /// ```
20    /// use prost_types::Timestamp;
21    /// use phenopacket_builder::{Buildable, Build};
22    ///
23    /// let ts: Timestamp = Timestamp::builder()
24    ///                       .seconds_nanos(125, 11)
25    ///                       .build();
26    ///
27    /// assert_eq!(ts.seconds, 125);
28    /// assert_eq!(ts.nanos, 11);
29    ///
30    /// assert_eq!(&ts.to_string(), "1970-01-01T00:02:05.000000011Z");
31    /// ```
32    pub fn seconds_nanos(
33        self,
34        seconds: impl Into<i64>,
35        nanos: impl Into<i32>,
36    ) -> TimestampBuilder<Set> {
37        TimestampBuilder {
38            timestamp: Some(prost_types::Timestamp {
39                seconds: seconds.into(),
40                nanos: nanos.into(),
41            }),
42            data: PhantomData,
43        }
44    }
45
46    /// Set ISO8601 timestamp, such as `1970-01-01` or `1970-01-01T00:10:05Z`.
47    ///
48    /// # Example
49    ///
50    /// Create a timestamp for a date of birth on Nov 3rd, 2021:
51    ///
52    /// ```
53    /// use prost_types::Timestamp;
54    /// use phenopacket_builder::{Buildable, Build};
55    ///
56    /// let ts: Timestamp = Timestamp::builder()
57    ///                       .iso8601timestamp("2021-11-03")
58    ///                       .expect("well formatted timestamp")
59    ///                       .build();
60    ///
61    /// assert_eq!(&ts.to_string(), "2021-11-03T00:00:00Z");
62    /// ```
63    ///
64    /// Create a timestamp with resolution in seconds:
65    ///
66    /// ```
67    /// use prost_types::Timestamp;
68    /// use phenopacket_builder::{Buildable, Build};
69    ///
70    /// let ts: Timestamp = Timestamp::builder()
71    ///                       .iso8601timestamp("1970-01-01T00:10:05Z")
72    ///                       .expect("well formatted timestamp")
73    ///                       .build();
74    ///
75    /// assert_eq!(ts.seconds, 605);
76    /// assert_eq!(ts.nanos, 0);
77    /// ```
78    pub fn iso8601timestamp(
79        self,
80        timestamp: impl AsRef<str>,
81    ) -> Result<TimestampBuilder<Set>, prost_types::TimestampError> {
82        Ok(TimestampBuilder {
83            timestamp: Some(timestamp.as_ref().parse()?),
84            data: PhantomData,
85        })
86    }
87}
88
89impl Buildable for prost_types::Timestamp {
90    type Builder = TimestampBuilder;
91}
92
93impl Build<prost_types::Timestamp> for TimestampBuilder<Set> {
94    fn build(self) -> prost_types::Timestamp {
95        self.timestamp.expect("timestamp must have been set")
96    }
97}