Skip to content

Support serde_json::Value as juniper::object::Object #504

@UkonnRa

Description

@UkonnRa

Say when writing a custom error:

#[derive(thiserror::Error, Debug, Deserialize, Serialize)]
    #[serde(tag = "type", content = "data")]
    enum SomeError {
        #[error("SomeError Item: arg1: {arg1}, arg2: {arg2}")]
        Item { arg1: String, arg2: i32 },
    }

I will return to the frontend as:

{
  ...,
  "extensions": {
    // this field is serialized from serde
    "data": {
      "arg1": "<some-arg1>",
      "arg2": "<some-arg2>"
    }
  }
}

So I write:

    impl IntoFieldError for SomeError {
        fn into_field_error(self) -> juniper::FieldError {
            let data = serde_json::to_value(&self)
                .ok()
                .and_then(|j| j.get("data").cloned())
                .unwrap_or_default();
            juniper::FieldError::new(
                self.to_string(),
                juniper::Value::object(
                    vec![
                        ("type", juniper::Value::scalar("SomeError")),
                        ("data", juniper::Value::object(data.into())),
                    ]
                    .into_iter()
                    .collect(),
                ),
            )
        }

But of course, it won't compile, for:

the trait bound `juniper::Object<_>: std::convert::From<serde_json::value::Value>` is not satisfied
  1. I think that serde_json::Value and juniper::object::Object should be convertable;
  2. Maybe HashMap<String, String> and juniper::object::Object should be convertable;
  3. JSON (mapped to serde_json::Value) scalar is needed

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementImprovement of existing features or bugfix

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions