Skip to content

Commit

Permalink
Migrate from chrono to time 0.3
Browse files Browse the repository at this point in the history
  • Loading branch information
fussybeaver committed Jan 18, 2022
1 parent a457b0f commit edfadfd
Show file tree
Hide file tree
Showing 12 changed files with 160 additions and 61 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Expand Up @@ -24,9 +24,8 @@ ct_logs = ["ssl", "ct-logs"]

[dependencies]
base64 = "0.13"
bollard-stubs = { version = "1.41.0" }
bollard-stubs = { version = "1.41.0", path = "codegen/target/generated-sources" }
bytes = "1"
chrono = { version = "0.4", features = ["serde"] }
ct-logs = { version = "0.9.0", optional = true }
dirs-next = "2.0"
futures-core = "0.3"
Expand All @@ -46,6 +45,7 @@ serde_json = "1.0"
serde_urlencoded = "0.7"
tokio = { version = "1.7", features = ["time", "fs", "net", "rt", "rt-multi-thread", "io-util"] }
thiserror = "1.0"
time = { version = "0.3", features = ["formatting", "parsing"] }
tokio-util = { version = "0.6", features = ["codec"] }
url = "2.2"
webpki-roots = { version = "0.22", optional = true }
Expand Down
6 changes: 4 additions & 2 deletions codegen/src/main/java/bollard/BollardCodegen.java
Expand Up @@ -22,6 +22,7 @@ public class BollardCodegen extends RustServerCodegen {

public BollardCodegen() {
super();
typeMapping.put("DateTime", "OffsetDateTime");
}

// Declare custom additions to inline enums that are behaving differently
Expand Down Expand Up @@ -136,9 +137,10 @@ public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
} else if (prop.name.equals("_type")) {
prop.name = "typ";
}
if (prop.dataFormat != null && prop.dataFormat.equals("dateTime")) {
if (prop.dataFormat != null && (prop.dataFormat.equals("dateTime") || prop.datatype.equals("OffsetDateTime"))) {
// set DateTime format on properties where appropriate
prop.datatype = "DateTime<Utc>";
prop.vendorExtensions.put("x-rustgen-is-datetime", true);
prop.datatype = "OffsetDateTime";
}
if (prop.isEnum) {
if (enumToString.contains(model.classname)) {
Expand Down
2 changes: 1 addition & 1 deletion codegen/src/main/resources/bollard/Cargo.mustache
Expand Up @@ -7,7 +7,7 @@ license = "Apache-2.0"
edition = "2018"

[dependencies]
chrono = { version = "0.4", features = ["serde"] }
serde = { version = "1.0", features = ["derive"] }
time = { version = "0.3", features = ["formatting", "parsing"] }

serde_with = "1.4"
31 changes: 27 additions & 4 deletions codegen/src/main/resources/bollard/models.mustache
Expand Up @@ -9,8 +9,7 @@ use std::collections::HashMap;
use std::default::Default;
use std::hash::Hash;

use chrono::DateTime;
use chrono::Utc;
use time::OffsetDateTime;

fn deserialize_nonoptional_vec<'de, D: Deserializer<'de>, T: DeserializeOwned>(
d: D,
Expand All @@ -24,6 +23,28 @@ fn deserialize_nonoptional_map<'de, D: Deserializer<'de>, T: DeserializeOwned>(
serde::Deserialize::deserialize(d).map(|x: Option<_>| x.unwrap_or(HashMap::new()))
}

fn deserialize_timestamp<'de, D: Deserializer<'de>>(
d: D
) -> Result<Option<OffsetDateTime>, D::Error> {
let opt: Option<String> = serde::Deserialize::deserialize(d)?;
if let Some(s) = opt {
Ok(Some(
OffsetDateTime::parse(&s, &time::format_description::well_known::Rfc3339)
.map_err(|e| serde::de::Error::custom(format!("{:?}", e)))?,
))
} else {
Ok(None)
}
}

fn serialize_timestamp<S: Serializer>(date: &Option<OffsetDateTime>, s: S) -> Result<S::Ok, S::Error> {
match date {
Some(inner) => Ok(s.serialize_str(&inner.format(&time::format_description::well_known::Rfc3339)
.map_err(|e| serde::ser::Error::custom(format!("{:?}", e)))?)?),
None => Ok(s.serialize_str("")?)
}
}

{{#models}}{{#model}}
{{#description}}/// {{{description}}}
{{/description}}{{#isEnum}}/// Enumeration of values.
Expand Down Expand Up @@ -68,10 +89,12 @@ pub struct {{classname}} {
#[serde(deserialize_with = "deserialize_nonoptional_map")]{{/isListContainer}}{{#isListContainer}}
#[serde(deserialize_with = "deserialize_nonoptional_vec")]{{/isListContainer}}{{/isContainer}}{{#isEnum}}
#[serde(skip_serializing_if="Option::is_none")]
#[serde(with = "serde_with::rust::string_empty_as_none")]{{/isEnum}}
#[serde(with = "serde_with::rust::string_empty_as_none")]{{/isEnum}}{{#vendorExtensions.x-rustgen-is-datetime}}
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]{{/vendorExtensions.x-rustgen-is-datetime}}
pub {{name}}: {{#isEnum}}Option<{{classname}}{{enumName}}>{{/isEnum}}{{^isEnum}}{{#isListContainer}}Vec<{{#items}}{{{datatype}}}{{/items}}>{{/isListContainer}}{{^isListContainer}}{{#isContainer}}HashMap<String, {{#items}}{{{datatype}}}{{/items}}>{{/isContainer}}{{^isContainer}}{{{datatype}}}{{/isContainer}}{{/isListContainer}}{{/isEnum}}{{#vendorExtensions}}{{/vendorExtensions}},
{{/required}}{{^required}}
#[serde(skip_serializing_if="Option::is_none")]
#[serde(skip_serializing_if="Option::is_none")]{{#vendorExtensions.x-rustgen-is-datetime}}
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]{{/vendorExtensions.x-rustgen-is-datetime}}
pub {{name}}: Option<{{#isEnum}}{{classname}}{{enumName}}{{/isEnum}}{{^isEnum}}{{#isListContainer}}Vec<{{#items}}{{{datatype}}}{{/items}}>{{/isListContainer}}{{^isListContainer}}{{#isContainer}}HashMap<String, {{#items}}{{{datatype}}}{{/items}}>{{/isContainer}}{{^isContainer}}{{{datatype}}}{{/isContainer}}{{/isListContainer}}{{/isEnum}}{{#vendorExtensions}}{{/vendorExtensions}}>,
{{/required}}

Expand Down
2 changes: 1 addition & 1 deletion codegen/target/generated-sources/Cargo.toml
Expand Up @@ -7,7 +7,7 @@ license = "Apache-2.0"
edition = "2018"

[dependencies]
chrono = { version = "0.4", features = ["serde"] }
serde = { version = "1.0", features = ["derive"] }
time = { version = "0.3", features = ["formatting", "parsing"] }

serde_with = "1.4"
2 changes: 1 addition & 1 deletion codegen/target/generated-sources/README.md
Expand Up @@ -9,7 +9,7 @@ To see how to make this your own, look here:

- API version: 1.41.0
- Code generation suffix: 0
- Build date: 2021-02-27T07:18:46.822Z
- Build date: 2022-01-18T17:41:15.437Z

This autogenerated project defines an API crate `bollard-stubs` which contains:
* Data types representing the underlying data model.
Expand Down
102 changes: 74 additions & 28 deletions codegen/target/generated-sources/src/models.rs
Expand Up @@ -9,8 +9,7 @@ use std::collections::HashMap;
use std::default::Default;
use std::hash::Hash;

use chrono::DateTime;
use chrono::Utc;
use time::OffsetDateTime;

fn deserialize_nonoptional_vec<'de, D: Deserializer<'de>, T: DeserializeOwned>(
d: D,
Expand All @@ -24,6 +23,28 @@ fn deserialize_nonoptional_map<'de, D: Deserializer<'de>, T: DeserializeOwned>(
serde::Deserialize::deserialize(d).map(|x: Option<_>| x.unwrap_or(HashMap::new()))
}

fn deserialize_timestamp<'de, D: Deserializer<'de>>(
d: D
) -> Result<Option<OffsetDateTime>, D::Error> {
let opt: Option<String> = serde::Deserialize::deserialize(d)?;
if let Some(s) = opt {
Ok(Some(
OffsetDateTime::parse(&s, &time::format_description::well_known::Rfc3339)
.map_err(|e| serde::de::Error::custom(format!("{:?}", e)))?,
))
} else {
Ok(None)
}
}

fn serialize_timestamp<S: Serializer>(date: &Option<OffsetDateTime>, s: S) -> Result<S::Ok, S::Error> {
match date {
Some(inner) => Ok(s.serialize_str(&inner.format(&time::format_description::well_known::Rfc3339)
.map_err(|e| serde::ser::Error::custom(format!("{:?}", e)))?)?),
None => Ok(s.serialize_str("")?)
}
}


/// Address represents an IPv4 or IPv6 IP address.
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
Expand Down Expand Up @@ -192,12 +213,14 @@ pub struct BuildCache {
/// Date and time at which the build cache was created in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

/// Date and time at which the build cache was last used in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "LastUsedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub last_used_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub last_used_at: Option<OffsetDateTime>,

#[serde(rename = "UsageCount")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -269,12 +292,14 @@ pub struct ClusterInfo {
/// Date and time at which the swarm was initialised in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

/// Date and time at which the swarm was last updated in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "UpdatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub updated_at: Option<OffsetDateTime>,

#[serde(rename = "Spec")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -333,11 +358,13 @@ pub struct Config {

#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

#[serde(rename = "UpdatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub updated_at: Option<OffsetDateTime>,

#[serde(rename = "Spec")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -1687,12 +1714,14 @@ pub struct HealthcheckResult {
/// Date and time at which this check started in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "Start")]
#[serde(skip_serializing_if="Option::is_none")]
pub start: Option<chrono::DateTime<chrono::Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub start: Option<OffsetDateTime>,

/// Date and time at which this check ended in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "End")]
#[serde(skip_serializing_if="Option::is_none")]
pub end: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub end: Option<OffsetDateTime>,

/// ExitCode meanings: - `0` healthy - `1` unhealthy - `2` reserved (considered unhealthy) - other values: error running probe
#[serde(rename = "ExitCode")]
Expand Down Expand Up @@ -1846,7 +1875,8 @@ pub struct ImageId {
pub struct ImageMetadata {
#[serde(rename = "LastTagTime")]
#[serde(skip_serializing_if="Option::is_none")]
pub last_tag_time: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub last_tag_time: Option<OffsetDateTime>,

}

Expand Down Expand Up @@ -2370,7 +2400,8 @@ pub struct Network {

#[serde(rename = "Created")]
#[serde(skip_serializing_if="Option::is_none")]
pub created: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created: Option<OffsetDateTime>,

#[serde(rename = "Scope")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -2650,12 +2681,14 @@ pub struct Node {
/// Date and time at which the node was added to the swarm in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

/// Date and time at which the node was last updated in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "UpdatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub updated_at: Option<OffsetDateTime>,

#[serde(rename = "Spec")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -3784,11 +3817,13 @@ pub struct Secret {

#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

#[serde(rename = "UpdatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub updated_at: Option<OffsetDateTime>,

#[serde(rename = "Spec")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -3837,11 +3872,13 @@ pub struct Service {

#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

#[serde(rename = "UpdatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub updated_at: Option<OffsetDateTime>,

#[serde(rename = "Spec")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -3918,7 +3955,8 @@ pub struct ServiceJobStatus {
/// The last time, as observed by the server, that this job was started.
#[serde(rename = "LastExecution")]
#[serde(skip_serializing_if="Option::is_none")]
pub last_execution: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub last_execution: Option<OffsetDateTime>,

}

Expand Down Expand Up @@ -4296,11 +4334,13 @@ pub struct ServiceUpdateStatus {

#[serde(rename = "StartedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub started_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub started_at: Option<OffsetDateTime>,

#[serde(rename = "CompletedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub completed_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub completed_at: Option<OffsetDateTime>,

#[serde(rename = "Message")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -4942,7 +4982,7 @@ pub struct SystemInfo {
#[serde(skip_serializing_if="Option::is_none")]
pub experimental_build: Option<bool>,

/// Version string of the daemon. > **Note**: the [standalone Swarm API](https://docs.docker.com/swarm/swarm-api/) > returns the Swarm version instead of the daemon version, for example > `swarm/1.2.8`.
/// Version string of the daemon. > **Note**: the [standalone Swarm API](/swarm/swarm-api/) > returns the Swarm version instead of the daemon version, for example > `swarm/1.2.8`.
#[serde(rename = "ServerVersion")]
#[serde(skip_serializing_if="Option::is_none")]
pub server_version: Option<String>,
Expand Down Expand Up @@ -5277,11 +5317,13 @@ pub struct Task {

#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

#[serde(rename = "UpdatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub updated_at: Option<OffsetDateTime>,

/// Name of the task.
#[serde(rename = "Name")]
Expand Down Expand Up @@ -6004,7 +6046,8 @@ impl ::std::str::FromStr for TaskState {
pub struct TaskStatus {
#[serde(rename = "Timestamp")]
#[serde(skip_serializing_if="Option::is_none")]
pub timestamp: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub timestamp: Option<OffsetDateTime>,

#[serde(rename = "State")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down Expand Up @@ -6100,7 +6143,8 @@ pub struct Volume {
/// Date/Time the volume was created.
#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

/// Low-level details about the volume, provided by the volume driver. Details are returned as a map with key/value pairs: `{\"key\":\"value\",\"key2\":\"value2\"}`. The `Status` field is optional, and is omitted if the volume driver does not support this feature.
#[serde(rename = "Status")]
Expand Down Expand Up @@ -6699,12 +6743,14 @@ pub struct Swarm {
/// Date and time at which the swarm was initialised in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "CreatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub created_at: Option<OffsetDateTime>,

/// Date and time at which the swarm was last updated in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
#[serde(rename = "UpdatedAt")]
#[serde(skip_serializing_if="Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]
pub updated_at: Option<OffsetDateTime>,

#[serde(rename = "Spec")]
#[serde(skip_serializing_if="Option::is_none")]
Expand Down

0 comments on commit edfadfd

Please sign in to comment.