pub mod cdrs;
pub mod commands;
pub mod credentials;
pub mod locations;
pub mod sessions;
pub mod tariffs;
pub mod tokens;
pub mod versions {
use serde::{Deserialize, Serialize};
use crate::types::validate_fields;
use crate::types::{Extensions, Url, Validate, Validator};
use crate::{InterfaceRole, ModuleId, VersionNumber};
pub use crate::v2_3_0::versions::Version;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct VersionDetails {
pub version: VersionNumber,
pub endpoints: Vec<Endpoint>,
#[serde(flatten, default, skip_serializing_if = "Extensions::is_empty")]
pub extensions: Extensions,
}
impl VersionDetails {
#[must_use]
pub fn url(&self, module: &ModuleId) -> Option<&Url> {
self.endpoints.iter().find(|e| e.identifier.matches(module)).map(|e| &e.url)
}
}
impl Validate for VersionDetails {
fn validate_in(&self, v: &mut Validator) {
validate_fields!(self, v, version, endpoints);
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct Endpoint {
pub identifier: ModuleId,
pub url: Url,
#[serde(flatten, default, skip_serializing_if = "Extensions::is_empty")]
pub extensions: Extensions,
}
impl Endpoint {
#[must_use]
pub fn new(identifier: ModuleId, url: Url) -> Self {
Self { identifier, url, extensions: Extensions::new() }
}
#[must_use]
pub const fn assumed_role(&self) -> InterfaceRole {
InterfaceRole::Sender
}
}
impl Validate for Endpoint {
fn validate_in(&self, v: &mut Validator) {
validate_fields!(self, v, identifier, url);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_2_1_1_endpoint_has_no_role_field() {
let json = r#"{"version":"2.1.1","endpoints":[{"identifier":"credentials","url":"https://example.com/ocpi/2.1.1/credentials"}]}"#;
let details: VersionDetails = serde_json::from_str(json).unwrap();
assert_eq!(details.endpoints[0].assumed_role(), InterfaceRole::Sender);
assert!(details.url(&ModuleId::Credentials).is_some());
assert_eq!(serde_json::to_string(&details).unwrap(), json);
}
}
}
pub use cdrs::Cdr;
pub use credentials::Credentials;
pub use locations::{Connector, Evse, Location};
pub use sessions::Session;
pub use tariffs::Tariff;
pub use tokens::Token;
pub use versions::{Endpoint, Version, VersionDetails};
pub const VERSION: crate::VersionNumber = crate::VersionNumber::V2_1_1;