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}