pub struct DeclarationPtrAsId;Expand description
(De)serializes a DeclarationPtr as its id.
On deserialization, each declaration is re-created with default dummy values, except for the id, which will be the same as the original declaration.
It is left to the user to fix these values before use. Before serialization, each object in
memory has a unique id; using this information, re-constructing the shared pointers should be
possible, as long as the contents of each object were also stored, e.g. with DeclarationPtrFull.
§Examples
Serialisation:
use serde::Serialize;
use serde_json::json;
use serde_with::serde_as;
use conjure_cp_core::ast::{declaration::serde::DeclarationPtrAsId,Name,DeclarationPtr,Domain,Range};
// some struct containing a DeclarationPtr.
#[serde_as]
#[derive(Clone,PartialEq,Eq,Serialize)]
struct Foo {
#[serde_as(as = "DeclarationPtrAsId")]
declaration: DeclarationPtr,
// serde as also supports nesting
#[serde_as(as = "Vec<(_,DeclarationPtrAsId)>")]
declarations: Vec<(i32,DeclarationPtr)>,
c: i32
}
let declaration = DeclarationPtr::new_var(Name::User("a".into()),Domain::Int(vec![Range::Bounded(1,5)]));
let mut declarations: Vec<(i32,DeclarationPtr)> = vec![];
for i in (1..=2) {
declarations.push((i,DeclarationPtr::new_var(Name::User(format!("{i}").into()),Domain::Int(vec![Range::Bounded(1,5)]))));
}
let foo = Foo {
declaration,
declarations,
c: 3
};
let json = serde_json::to_value(foo).unwrap();
let expected_json = json!({
"declaration": 0,
"declarations": [(1,1),(2,2)],
"c": 3
});
assert_eq!(json,expected_json);Deserialisation:
use serde::Deserialize;
use serde_json::json;
use serde_with::serde_as;
use conjure_cp_core::ast::{serde::{HasId},declaration::serde::DeclarationPtrAsId,Name,DeclarationKind, DeclarationPtr,Domain,Range, ReturnType};
// some struct containing a DeclarationPtr.
#[serde_as]
#[derive(Clone,PartialEq,Eq,Deserialize)]
struct Foo {
#[serde_as(as = "DeclarationPtrAsId")]
declaration: DeclarationPtr,
// serde as also supports nesting
#[serde_as(as = "Vec<(_,DeclarationPtrAsId)>")]
declarations: Vec<(i32,DeclarationPtr)>,
c: i32
}
let input_json = json!({
"declaration": 10,
"declarations": [(11,11),(12,12)],
"c": 3
});
let foo: Foo = serde_json::from_value(input_json).unwrap();
// all declarations should have the dummy values: name: User("_UNKNOWN"), kind: value_letting;
assert_eq!(&foo.declaration.name() as &Name,&Name::User("_UNKNOWN".into()));
assert_eq!(&foo.declarations[0].1.name() as &Name,&Name::User("_UNKNOWN".into()));
assert_eq!(&foo.declarations[1].1.name() as &Name,&Name::User("_UNKNOWN".into()));
assert!(matches!(&foo.declaration.kind() as &DeclarationKind,&DeclarationKind::ValueLetting(_)));
assert!(matches!(&foo.declarations[0].1.kind() as &DeclarationKind,&DeclarationKind::ValueLetting(_)));
assert!(matches!(&foo.declarations[1].1.kind() as &DeclarationKind,&DeclarationKind::ValueLetting(_)));
// but ids should be the same
assert_eq!(*&foo.declaration.id(),10);
assert_eq!(*&foo.declarations[0].1.id(),11);
assert_eq!(*&foo.declarations[1].1.id(),12);Trait Implementations§
Source§impl<'de> DeserializeAs<'de, DeclarationPtr> for DeclarationPtrAsId
impl<'de> DeserializeAs<'de, DeclarationPtr> for DeclarationPtrAsId
Source§fn deserialize_as<D>(
deserializer: D,
) -> Result<DeclarationPtr, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(
deserializer: D,
) -> Result<DeclarationPtr, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Source§impl SerializeAs<DeclarationPtr> for DeclarationPtrAsId
impl SerializeAs<DeclarationPtr> for DeclarationPtrAsId
Source§fn serialize_as<S>(
source: &DeclarationPtr,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize_as<S>(
source: &DeclarationPtr,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
Auto Trait Implementations§
impl Freeze for DeclarationPtrAsId
impl RefUnwindSafe for DeclarationPtrAsId
impl Send for DeclarationPtrAsId
impl Sync for DeclarationPtrAsId
impl Unpin for DeclarationPtrAsId
impl UnwindSafe for DeclarationPtrAsId
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 0 bytes