Skip to content

Commit b0d1d9b

Browse files
committed
Simplify arena allocator example
1 parent 7d0111e commit b0d1d9b

File tree

12 files changed

+68
-57
lines changed

12 files changed

+68
-57
lines changed

crates/cgp-serde-alloc/src/providers/alloc_deserialize.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ impl<'de, 'a, Context, Value> ValueDeserializer<'de, &'a Value> for Context
88
where
99
Context: CanAlloc<'a, Value> + CanDeserializeValue<'de, Value>,
1010
{
11-
fn deserialize<D>(context: &Context, deserializer: D) -> Result<&'a Value, D::Error>
11+
fn deserialize<D>(&self, deserializer: D) -> Result<&'a Value, D::Error>
1212
where
1313
D: serde::Deserializer<'de>,
1414
{
15-
let value = context.deserialize(deserializer)?;
16-
let value = context.alloc(value);
15+
let value = self.deserialize(deserializer)?;
16+
let value = self.alloc(value);
1717

1818
Ok(value)
1919
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use cgp::prelude::*;
2+
3+
use crate::code::DeserializeJson;
4+
use crate::providers::DeserializeFromJsonString;
5+
6+
pub trait CanDeserializeJsonString<T>: HasErrorType {
7+
fn deserialize_json_string(&self, serialized: &str) -> Result<T, Self::Error>;
8+
}
9+
10+
impl<Context, T> CanDeserializeJsonString<T> for Context
11+
where
12+
Context: HasErrorType,
13+
DeserializeFromJsonString:
14+
for<'a> TryComputer<Context, DeserializeJson<T>, &'a str, Output = T>,
15+
{
16+
fn deserialize_json_string(&self, serialized: &str) -> Result<T, Self::Error> {
17+
<DeserializeFromJsonString>::try_compute(self, PhantomData, &serialized)
18+
}
19+
}
Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
mod from_reader;
2-
mod from_str;
3-
mod to_string;
1+
mod deserialize;
42

5-
pub use from_reader::*;
6-
pub use from_str::*;
7-
pub use to_string::*;
3+
pub use deserialize::*;

crates/cgp-serde-json/src/lib.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,5 @@
33
extern crate alloc;
44

55
pub mod code;
6-
7-
mod impls;
8-
9-
pub use impls::*;
6+
pub mod impls;
7+
pub mod providers;

crates/cgp-serde-json/src/impls/from_str.rs renamed to crates/cgp-serde-json/src/providers/from_str.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
use cgp::prelude::*;
22
use serde_json::de::StrRead;
33

4-
use crate::DeserializeFromJsonReader;
4+
use crate::providers::DeserializeFromJsonReader;
55

66
pub struct DeserializeFromJsonString<InDeserializer = DeserializeFromJsonReader>(
77
pub PhantomData<InDeserializer>,
88
);
99

1010
#[cgp_impl(DeserializeFromJsonString<InDeserializer>)]
11-
impl<'a, Context, Code, Value, S, InDeserializer> TryComputer<Code, &'a S> for Context
11+
impl<Context, Code, Value, S, InDeserializer> TryComputer<Code, S> for Context
1212
where
1313
Context: HasErrorType,
14-
InDeserializer: TryComputer<Context, Code, StrRead<'a>, Output = Value>,
14+
InDeserializer: for<'a> TryComputer<Context, Code, StrRead<'a>, Output = Value>,
1515
S: AsRef<str>,
1616
{
1717
type Output = Value;
1818

1919
fn try_compute(
2020
context: &Context,
2121
code: PhantomData<Code>,
22-
source: &'a S,
22+
source: S,
2323
) -> Result<Value, Context::Error> {
2424
InDeserializer::try_compute(context, code, StrRead::new(source.as_ref()))
2525
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
mod from_reader;
2+
mod from_str;
3+
mod to_string;
4+
5+
pub use from_reader::*;
6+
pub use from_str::*;
7+
pub use to_string::*;

crates/cgp-serde-tests/src/tests/arena.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use cgp::core::error::{ErrorRaiserComponent, ErrorTypeProviderComponent};
2-
use cgp::extra::handler::CanTryCompute;
32
use cgp::prelude::*;
43
use cgp_error_anyhow::{RaiseAnyhowError, UseAnyhowError};
54
use cgp_serde::components::ValueDeserializerComponent;
65
use cgp_serde::providers::{DeserializeExtend, DeserializeRecordFields, UseSerde};
76
use cgp_serde_alloc::providers::DeserializeAndAllocate;
87
use cgp_serde_alloc::traits::AllocatorComponent;
98
use cgp_serde_json::code::{DeserializeJson, SerializeJson};
10-
use cgp_serde_json::{DeserializeFromJsonString, SerializeToJsonString};
9+
use cgp_serde_json::impls::CanDeserializeJsonString;
10+
use cgp_serde_json::providers::{DeserializeFromJsonString, SerializeToJsonString};
1111
use cgp_serde_typed_arena::providers::AllocateWithArena;
1212
use cgp_serde_typed_arena::traits::ArenaGetterComponent;
1313
use typed_arena::Arena;
@@ -43,14 +43,15 @@ delegate_components! {
4343
ValueDeserializerComponent:
4444
UseDelegate<new DeserializeComponents {
4545
u64: UseSerde,
46-
Coord:
46+
[
47+
Coord,
48+
<'a> Payload<'a>,
49+
]:
4750
DeserializeRecordFields,
4851
<'a> &'a Coord:
4952
DeserializeAndAllocate,
5053
<'a> Vec<&'a Coord>:
5154
DeserializeExtend,
52-
<'a> Payload<'a>:
53-
DeserializeRecordFields,
5455

5556
}>,
5657
TryComputerComponent:
@@ -97,9 +98,8 @@ fn test_deserialize_with_arena() {
9798
let arena = Arena::new();
9899
let app = App { arena: &arena };
99100

100-
let deserialized: Payload<'_> = app
101-
.try_compute(PhantomData::<DeserializeJson<Payload<'_>>>, &serialized)
102-
.unwrap();
101+
let deserialized: Payload<'_> = app.deserialize_json_string(&serialized).unwrap();
102+
103103
assert_eq!(
104104
deserialized,
105105
Payload {

crates/cgp-serde-tests/src/tests/arena_simplified.rs

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
use cgp::core::error::{ErrorRaiserComponent, ErrorTypeProviderComponent};
2-
use cgp::extra::handler::CanTryCompute;
32
use cgp::prelude::*;
43
use cgp_error_anyhow::{RaiseAnyhowError, UseAnyhowError};
54
use cgp_serde::components::{CanDeserializeValue, ValueDeserializer, ValueDeserializerComponent};
65
use cgp_serde::providers::{DeserializeExtend, DeserializeRecordFields, UseSerde};
7-
use cgp_serde_json::code::{DeserializeJson, SerializeJson};
8-
use cgp_serde_json::{DeserializeFromJsonString, SerializeToJsonString};
6+
use cgp_serde_json::impls::CanDeserializeJsonString;
97
use typed_arena::Arena;
108

119
#[cgp_auto_getter]
@@ -18,26 +16,26 @@ impl<'de, 'a, Context, Value> ValueDeserializer<'de, &'a Value> for Context
1816
where
1917
Context: HasArena<'a, Value> + CanDeserializeValue<'de, Value>,
2018
{
21-
fn deserialize<D>(context: &Context, deserializer: D) -> Result<&'a Value, D::Error>
19+
fn deserialize<D>(&self, deserializer: D) -> Result<&'a Value, D::Error>
2220
where
2321
D: serde::Deserializer<'de>,
2422
{
25-
let value = context.deserialize(deserializer)?;
26-
let value = context.arena().alloc(value);
23+
let value = self.deserialize(deserializer)?;
24+
let value = self.arena().alloc(value);
2725

2826
Ok(value)
2927
}
3028
}
3129

32-
#[derive(Debug, PartialEq, Eq, HasFields, BuildField)]
30+
#[derive(Debug, PartialEq, Eq, CgpData)]
3331
pub struct Coord {
3432
pub x: u64,
3533
pub y: u64,
3634
pub z: u64,
3735
}
3836

39-
#[derive(Debug, PartialEq, Eq, HasFields, BuildField)]
40-
pub struct Payload<'a> {
37+
#[derive(Debug, PartialEq, Eq, CgpData)]
38+
pub struct Cluster<'a> {
4139
pub id: u64,
4240
pub coords: Vec<&'a Coord>,
4341
}
@@ -48,31 +46,25 @@ pub struct App<'a> {
4846
}
4947

5048
delegate_components! {
51-
<'a> App<'a> {
52-
ErrorTypeProviderComponent:
53-
UseAnyhowError,
54-
ErrorRaiserComponent:
55-
RaiseAnyhowError,
49+
<'s> App<'s> {
5650
ValueDeserializerComponent:
5751
UseDelegate<new DeserializeComponents {
5852
u64: UseSerde,
59-
Coord:
53+
[
54+
Coord,
55+
<'a> Cluster<'a>,
56+
]:
6057
DeserializeRecordFields,
6158
<'a> &'a Coord:
6259
DeserializeAndAllocate,
6360
<'a> Vec<&'a Coord>:
6461
DeserializeExtend,
65-
<'a> Payload<'a>:
66-
DeserializeRecordFields,
6762

6863
}>,
69-
TryComputerComponent:
70-
UseDelegate<new JsonEncodingComponents {
71-
SerializeJson:
72-
SerializeToJsonString,
73-
<T> DeserializeJson<T>:
74-
DeserializeFromJsonString
75-
}>,
64+
ErrorTypeProviderComponent:
65+
UseAnyhowError,
66+
ErrorRaiserComponent:
67+
RaiseAnyhowError,
7668
}
7769
}
7870

@@ -90,7 +82,7 @@ check_components! {
9082
(Life<'de>, u64),
9183
(Life<'de>, Coord),
9284
(Life<'de>, &'a Coord),
93-
(Life<'de>, Payload<'a>),
85+
(Life<'de>, Cluster<'a>),
9486
]
9587
}
9688
}
@@ -110,12 +102,11 @@ fn test_deserialize_with_arena() {
110102
let arena = Arena::new();
111103
let app = App { arena: &arena };
112104

113-
let deserialized: Payload<'_> = app
114-
.try_compute(PhantomData::<DeserializeJson<Payload<'_>>>, &serialized)
115-
.unwrap();
105+
let deserialized: Cluster<'_> = app.deserialize_json_string(&serialized).unwrap();
106+
116107
assert_eq!(
117108
deserialized,
118-
Payload {
109+
Cluster {
119110
id: 8,
120111
coords: vec![&Coord { x: 1, y: 2, z: 3 }, &Coord { x: 4, y: 5, z: 6 },]
121112
}

0 commit comments

Comments
 (0)