juniper icon indicating copy to clipboard operation
juniper copied to clipboard

Support `serde_json::Value` as `juniper::object::Object`

Open UkonnRa opened this issue 5 years ago • 2 comments

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

UkonnRa avatar Jan 26 '20 14:01 UkonnRa

I agree; I would love to see this feature behind a disabled by default feature flag.

See #325 and #280.

mwilliammyers avatar Jan 27 '20 18:01 mwilliammyers

@mwilliammyers What is the status of the PR? I would love this feature.

littledivy avatar Jul 13 '20 08:07 littledivy