Skip to main content

Extensions

Struct Extensions 

Source
pub struct Extensions(/* private fields */);
Expand description

Undocumented JSON fields found on an OCPI object, preserved verbatim.

OCPI 2.3.0 is explicit:

An OCPI Platform SHALL NOT reject request or response payloads based on the presence of JSON object field names that are not documented in this specification.

OCPI implementers are encouraged to extend OCPI with new fields to address needs that are not foreseen by the specification.

Every OCPI object in this crate carries an extensions field marked #[serde(flatten)], so a vendor field arrives, survives, and is written back out unchanged. A hub built on this crate can therefore sit between two parties that have agreed on an extension without knowing anything about it — which is the whole point of that paragraph, and the thing generated type sets get wrong.

Keys are kept in a BTreeMap, so serialisation order is deterministic.

Every wire object in this crate carries one as a #[serde(flatten)] field, so the undocumented members of the object it came from land here and are written straight back:

use ocpi_kit::types::Extensions;

let json = r#"{"acme_note":"kerbside","nltnm_accuracy_m":3}"#;
let extensions: Extensions = serde_json::from_str(json).unwrap();

assert_eq!(extensions.get::<u32>("nltnm_accuracy_m").unwrap(), Some(3));
assert_eq!(serde_json::to_string(&extensions).unwrap(), json);

In place, on a real object:

let json = r#"{"latitude":"52.010","longitude":"4.350","nltnm_accuracy_m":3}"#;
let geo: GeoLocation = serde_json::from_str(json).unwrap();
assert_eq!(geo.extensions.get::<u32>("nltnm_accuracy_m").unwrap(), Some(3));
assert_eq!(serde_json::to_string(&geo).unwrap(), json);

Spec: 2.3.0 §transport_and_format — Non-specified JSON fields

Implementations§

Source§

impl Extensions

Source

pub fn new() -> Self

An empty set of extensions.

Source

pub fn is_empty(&self) -> bool

Whether no undocumented field was present.

Objects skip serialising their extensions field when this is true, so an object that carried no extensions is written back byte-identically.

Source

pub fn len(&self) -> usize

How many undocumented fields are present.

Source

pub fn get_raw(&self, key: &str) -> Option<&Value>

The raw JSON value stored under key, if any.

Source

pub fn get<T: DeserializeOwned>(&self, key: &str) -> Result<Option<T>, Error>

Deserialises the value stored under key into T.

Returns Ok(None) when the key is absent, and Err when it is present but does not deserialise into T.

§Errors

Propagates the serde_json error describing why the value did not fit T.

Source

pub fn insert<T: Serialize>( &mut self, key: impl Into<String>, value: T, ) -> Result<(), Error>

Stores value under key, replacing any previous value.

§Errors

Propagates the serde_json error if value cannot be serialised.

Source

pub fn remove(&mut self, key: &str) -> Option<Value>

Removes and returns the raw value stored under key.

Source

pub fn contains_key(&self, key: &str) -> bool

Whether key is present.

Source

pub fn iter(&self) -> impl Iterator<Item = (&String, &Value)>

The undocumented fields, in key order.

Source

pub fn keys(&self) -> impl Iterator<Item = &String>

The field names, in order.

Trait Implementations§

Source§

impl Clone for Extensions

Source§

fn clone(&self) -> Extensions

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Extensions

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Extensions

Source§

fn default() -> Extensions

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for Extensions

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<K: Into<String>, V: Into<Value>> FromIterator<(K, V)> for Extensions

Source§

fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self

Creates a value from an iterator. Read more
Source§

impl<'a> IntoIterator for &'a Extensions

Source§

type Item = (&'a String, &'a Value)

The type of the elements being iterated over.
Source§

type IntoIter = Iter<'a, String, Value>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl JsonSchema for Extensions

Available on crate feature schema only.
Source§

fn schema_name() -> Cow<'static, str>

The name of the generated JSON Schema. Read more
Source§

fn json_schema(_g: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn inline_schema() -> bool

Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the $ref keyword. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

impl PartialEq for Extensions

Source§

fn eq(&self, other: &Extensions) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for Extensions

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for Extensions

Source§

impl Validate for Extensions

Source§

fn validate_in(&self, _v: &mut Validator)

Appends this value’s violations to v, relative to v’s current position.
Source§

fn validate(&self) -> Result<(), Violations>

Validates this value as the root of an object graph. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more