Skip to content

Commit

Permalink
Replace HRTBs with DeserializeOwned
Browse files Browse the repository at this point in the history
Replaces `for<'de> Deserialize<'de>` higher-rank trait bounds (HRTBs)
with the much simpler `DeserializeOwned` helper trait.

This change has no effect on semantics or compatibility.
  • Loading branch information
nvzqz committed Jun 12, 2023
1 parent 94c6243 commit 5d338d0
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 77 deletions.
19 changes: 7 additions & 12 deletions trustfall_core/src/interpreter/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::{collections::BTreeMap, fmt::Debug, sync::Arc};

use async_graphql_parser::types::Type;
use itertools::Itertools;
use serde::{Deserialize, Serialize};
use serde::{de::DeserializeOwned, Deserialize, Serialize};

use crate::{
ir::{
Expand Down Expand Up @@ -125,11 +125,10 @@ impl From<ValueOrVec> for FieldValue {
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(bound = "Vertex: Serialize, for<'de2> Vertex: Deserialize<'de2>")]
#[serde(bound = "Vertex: Serialize + DeserializeOwned")]
struct SerializableContext<Vertex>
where
Vertex: Clone + Debug + Serialize,
for<'d> Vertex: Deserialize<'d>,
Vertex: Clone + Debug + Serialize + DeserializeOwned,
{
active_vertex: Option<Vertex>,
vertices: BTreeMap<Vid, Option<Vertex>>,
Expand All @@ -156,8 +155,7 @@ where

impl<Vertex> From<SerializableContext<Vertex>> for DataContext<Vertex>
where
Vertex: Clone + Debug + Serialize,
for<'d> Vertex: Deserialize<'d>,
Vertex: Clone + Debug + Serialize + DeserializeOwned,
{
fn from(context: SerializableContext<Vertex>) -> Self {
Self {
Expand All @@ -175,8 +173,7 @@ where

impl<Vertex> From<DataContext<Vertex>> for SerializableContext<Vertex>
where
Vertex: Clone + Debug + Serialize,
for<'d> Vertex: Deserialize<'d>,
Vertex: Clone + Debug + Serialize + DeserializeOwned,
{
fn from(context: DataContext<Vertex>) -> Self {
Self {
Expand Down Expand Up @@ -305,8 +302,7 @@ impl<Vertex: Debug + Clone + PartialEq + Eq> Eq for DataContext<Vertex> {}

impl<Vertex> Serialize for DataContext<Vertex>
where
Vertex: Debug + Clone + Serialize,
for<'d> Vertex: Deserialize<'d>,
Vertex: Debug + Clone + Serialize + DeserializeOwned,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
Expand All @@ -319,8 +315,7 @@ where

impl<'de, Vertex> Deserialize<'de> for DataContext<Vertex>
where
Vertex: Debug + Clone + Serialize,
for<'d> Vertex: Deserialize<'d>,
Vertex: Debug + Clone + Serialize + DeserializeOwned,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
Expand Down
53 changes: 23 additions & 30 deletions trustfall_core/src/interpreter/replay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use std::{
sync::Arc,
};

use serde::{Deserialize, Serialize};
use serde::{de::DeserializeOwned, Serialize};

use crate::{
interpreter::VertexInfo,
Expand All @@ -25,8 +25,7 @@ use super::{
#[derive(Clone, Debug)]
struct TraceReaderAdapter<'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'trace,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'trace,
{
next_op: Rc<RefCell<btree_map::Iter<'trace, Opid, TraceOp<Vertex>>>>,
}
Expand All @@ -40,8 +39,7 @@ fn advance_ref_iter<T, Iter: Iterator<Item = T>>(iter: &RefCell<Iter>) -> Option
#[derive(Debug)]
struct TraceReaderStartingVerticesIter<'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'trace,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'trace,
{
exhausted: bool,
parent_opid: Opid,
Expand All @@ -51,8 +49,7 @@ where
#[allow(unused_variables)]
impl<'trace, Vertex> Iterator for TraceReaderStartingVerticesIter<'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'trace,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'trace,
{
type Item = Vertex;

Expand Down Expand Up @@ -86,8 +83,7 @@ where

struct TraceReaderResolvePropertiesIter<'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'trace,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'trace,
{
exhausted: bool,
parent_opid: Opid,
Expand All @@ -99,8 +95,7 @@ where
#[allow(unused_variables)]
impl<'trace, Vertex> Iterator for TraceReaderResolvePropertiesIter<'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'trace,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'trace,
{
type Item = (DataContext<Vertex>, FieldValue);

Expand Down Expand Up @@ -166,8 +161,8 @@ where

struct TraceReaderResolveCoercionIter<'query, 'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'query,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'query,

'trace: 'query,
{
exhausted: bool,
Expand All @@ -180,8 +175,8 @@ where
#[allow(unused_variables)]
impl<'query, 'trace, Vertex> Iterator for TraceReaderResolveCoercionIter<'query, 'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'query,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'query,

'trace: 'query,
{
type Item = (DataContext<Vertex>, bool);
Expand Down Expand Up @@ -249,8 +244,8 @@ where

struct TraceReaderResolveNeighborsIter<'query, 'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'query,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'query,

'trace: 'query,
{
exhausted: bool,
Expand All @@ -262,8 +257,8 @@ where

impl<'query, 'trace, Vertex> Iterator for TraceReaderResolveNeighborsIter<'query, 'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'query,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'query,

'trace: 'query,
{
type Item = (DataContext<Vertex>, VertexIterator<'query, Vertex>);
Expand Down Expand Up @@ -339,8 +334,8 @@ where

struct TraceReaderNeighborIter<'query, 'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'query,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'query,

'trace: 'query,
{
exhausted: bool,
Expand All @@ -352,8 +347,8 @@ where

impl<'query, 'trace, Vertex> Iterator for TraceReaderNeighborIter<'query, 'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'query,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'query,

'trace: 'query,
{
type Item = Vertex;
Expand Down Expand Up @@ -390,8 +385,7 @@ where
#[allow(unused_variables)]
impl<'trace, Vertex> Adapter<'trace> for TraceReaderAdapter<'trace, Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'trace,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'trace,
{
type Vertex = Vertex;

Expand Down Expand Up @@ -516,8 +510,8 @@ pub fn assert_interpreted_results<'query, 'trace, Vertex>(
expected_results: &[BTreeMap<Arc<str>, FieldValue>],
complete: bool,
) where
Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'query,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'query,

'trace: 'query,
{
let next_op = Rc::new(RefCell::new(trace.ops.iter()));
Expand Down Expand Up @@ -577,7 +571,7 @@ mod tests {
path::{Path, PathBuf},
};

use serde::{Deserialize, Serialize};
use serde::{de::DeserializeOwned, Serialize};
use trustfall_filetests_macros::parameterize;

use crate::{
Expand All @@ -594,8 +588,7 @@ mod tests {
test_data: TestInterpreterOutputTrace<Vertex>,
test_outputs: TestInterpreterOutputData,
) where
Vertex: Debug + Clone + PartialEq + Eq + Serialize,
for<'de> Vertex: Deserialize<'de>,
Vertex: Debug + Clone + PartialEq + Eq + Serialize + DeserializeOwned,
{
// Ensure that the trace file's IR hasn't drifted away from the IR file of the same name.
assert_eq!(expected_ir.ir_query, test_data.trace.ir_query);
Expand Down
37 changes: 14 additions & 23 deletions trustfall_core/src/interpreter/trace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::{
rc::Rc, sync::Arc,
};

use serde::{Deserialize, Serialize};
use serde::{de::DeserializeOwned, Deserialize, Serialize};

use crate::{
interpreter::{Adapter, DataContext},
Expand All @@ -20,11 +20,10 @@ use super::{
pub struct Opid(pub NonZeroUsize); // operation ID

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "Vertex: Serialize, for<'de2> Vertex: Deserialize<'de2>")]
#[serde(bound = "Vertex: Serialize + DeserializeOwned")]
pub struct Trace<Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned,
{
pub ops: BTreeMap<Opid, TraceOp<Vertex>>,

Expand All @@ -36,8 +35,7 @@ where

impl<Vertex> Trace<Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned,
{
#[allow(dead_code)]
pub fn new(ir_query: IRQuery, arguments: BTreeMap<String, FieldValue>) -> Self {
Expand All @@ -62,11 +60,10 @@ where
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "Vertex: Serialize, for<'de2> Vertex: Deserialize<'de2>")]
#[serde(bound = "Vertex: Serialize + DeserializeOwned")]
pub struct TraceOp<Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned,
{
pub opid: Opid,
pub parent_opid: Option<Opid>, // None parent_opid means this is a top-level operation
Expand All @@ -75,11 +72,10 @@ where
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "Vertex: Serialize, for<'de2> Vertex: Deserialize<'de2>")]
#[serde(bound = "Vertex: Serialize + DeserializeOwned")]
pub enum TraceOpContent<Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned,
{
// TODO: make a way to differentiate between different queries recorded in the same trace
Call(FunctionCall),
Expand All @@ -105,11 +101,10 @@ pub enum FunctionCall {

#[allow(clippy::enum_variant_names)] // the variant names match the functions they represent
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "Vertex: Serialize, for<'de2> Vertex: Deserialize<'de2>")]
#[serde(bound = "Vertex: Serialize + DeserializeOwned")]
pub enum YieldValue<Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned,
{
ResolveStartingVertices(Vertex),
ResolveProperty(DataContext<Vertex>, FieldValue),
Expand Down Expand Up @@ -181,8 +176,7 @@ fn make_iter_with_pre_action<T, I: Iterator<Item = T>, F: Fn()>(
pub struct AdapterTap<'vertex, AdapterT>
where
AdapterT: Adapter<'vertex>,
AdapterT::Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'vertex,
for<'de2> AdapterT::Vertex: Deserialize<'de2>,
AdapterT::Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'vertex,
{
tracer: Rc<RefCell<Trace<AdapterT::Vertex>>>,
inner: AdapterT,
Expand All @@ -192,8 +186,7 @@ where
impl<'vertex, AdapterT> AdapterTap<'vertex, AdapterT>
where
AdapterT: Adapter<'vertex>,
AdapterT::Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'vertex,
for<'de2> AdapterT::Vertex: Deserialize<'de2>,
AdapterT::Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'vertex,
{
pub fn new(adapter: AdapterT, tracer: Rc<RefCell<Trace<AdapterT::Vertex>>>) -> Self {
Self {
Expand All @@ -218,8 +211,7 @@ pub fn tap_results<'vertex, AdapterT>(
) -> impl Iterator<Item = BTreeMap<Arc<str>, FieldValue>> + 'vertex
where
AdapterT: Adapter<'vertex> + 'vertex,
AdapterT::Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'vertex,
for<'de2> AdapterT::Vertex: Deserialize<'de2>,
AdapterT::Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'vertex,
{
result_iter.map(move |result| {
adapter_tap
Expand All @@ -234,8 +226,7 @@ where
impl<'vertex, AdapterT> Adapter<'vertex> for AdapterTap<'vertex, AdapterT>
where
AdapterT: Adapter<'vertex>,
AdapterT::Vertex: Clone + Debug + PartialEq + Eq + Serialize + 'vertex,
for<'de2> AdapterT::Vertex: Deserialize<'de2>,
AdapterT::Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned + 'vertex,
{
type Vertex = AdapterT::Vertex;

Expand Down
6 changes: 3 additions & 3 deletions trustfall_core/src/serialization/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::{collections::BTreeMap, sync::Arc};

use serde::de;
use serde::de::DeserializeOwned;

use crate::ir::FieldValue;

Expand Down Expand Up @@ -51,13 +51,13 @@ mod tests;
pub trait TryIntoStruct {
type Error;

fn try_into_struct<S: for<'de> de::Deserialize<'de>>(self) -> Result<S, Self::Error>;
fn try_into_struct<S: DeserializeOwned>(self) -> Result<S, Self::Error>;
}

impl TryIntoStruct for BTreeMap<Arc<str>, FieldValue> {
type Error = deserializers::Error;

fn try_into_struct<S: for<'de> de::Deserialize<'de>>(self) -> Result<S, deserializers::Error> {
fn try_into_struct<S: DeserializeOwned>(self) -> Result<S, deserializers::Error> {
let deserializer = deserializers::QueryResultDeserializer::new(self);
S::deserialize(deserializer)
}
Expand Down
7 changes: 3 additions & 4 deletions trustfall_core/src/test_types.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::{collections::BTreeMap, fmt::Debug, sync::Arc};

use serde::{Deserialize, Serialize};
use serde::{de::DeserializeOwned, Deserialize, Serialize};

use crate::{
frontend::error::FrontendError,
Expand Down Expand Up @@ -44,11 +44,10 @@ pub struct TestIRQuery {
pub type TestIRQueryResult = Result<TestIRQuery, FrontendError>;

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "Vertex: Serialize, for<'de2> Vertex: Deserialize<'de2>")]
#[serde(bound = "Vertex: Serialize + DeserializeOwned")]
pub struct TestInterpreterOutputTrace<Vertex>
where
Vertex: Clone + Debug + PartialEq + Eq + Serialize,
for<'de2> Vertex: Deserialize<'de2>,
Vertex: Clone + Debug + PartialEq + Eq + Serialize + DeserializeOwned,
{
pub schema_name: String,

Expand Down
Loading

0 comments on commit 5d338d0

Please sign in to comment.