Skip to content

Commit

Permalink
Improve error on compiling with neither std nor alloc
Browse files Browse the repository at this point in the history
Before:

    error: expected item, found `"serde_json requires that either `std` (default) or `alloc` feature is enabled"`
     --> src/features_check/error.rs:1:1
      |
    1 | "serde_json requires that either `std` (default) or `alloc` feature is enabled"
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected item

    error[E0407]: method `visit_string` is not a member of trait `Visitor`
       --> src/raw.rs:455:5
        |
    455 |       fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
        |       ^  ------------ help: there is an associated function with a similar name: `visit_str`
        |  _____|
        | |
    456 | |     where
    457 | |         E: de::Error,
    458 | |     {
    459 | |         Ok(RawValue::from_owned(s.into_boxed_str()))
    460 | |     }
        | |_____^ not a member of trait `Visitor`

    error[E0046]: not all trait items implemented, missing: `collect_str`
        --> src/ser.rs:1376:1
         |
    1376 | impl<'a, W: io::Write, F: Formatter> ser::Serializer for RawValueStrEmitter<'a, W, F> {
         | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `collect_str` in implementation
         |
         = help: implement the missing item: `fn collect_str<T>(self, _: &T) -> core::result::Result<<Self as serde::Serializer>::Ok, <Self as serde::Serializer>::Error> where T: Display { todo!() }`

    error[E0046]: not all trait items implemented, missing: `collect_str`
       --> src/value/ser.rs:864:1
        |
    864 | impl serde::ser::Serializer for RawValueEmitter {
        | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `collect_str` in implementation
        |
        = help: implement the missing item: `fn collect_str<T>(self, _: &T) -> core::result::Result<<Self as serde::Serializer>::Ok, <Self as serde::Serializer>::Error> where T: Display { todo!() }`

    error[E0599]: no method named `visit_string` found for struct `BoxedFromString` in the current scope
       --> src/raw.rs:452:14
        |
    428 | pub struct BoxedFromString;
        | --------------------------- method `visit_string` not found for this
    ...
    452 |         self.visit_string(s.to_owned())
        |              ^^^^^^^^^^^^ method not found in `BoxedFromString`

After:

    error: expected item, found `"serde_json requires that either `std` (default) or `alloc` feature is enabled"`
     --> src/features_check/error.rs:1:1
      |
    1 | "serde_json requires that either `std` (default) or `alloc` feature is enabled"
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected item
  • Loading branch information
dtolnay committed Jan 22, 2022
1 parent 4c15649 commit 5fe9bdd
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/raw.rs
Original file line number Diff line number Diff line change
Expand Up @@ -449,9 +449,10 @@ impl<'de> Visitor<'de> for BoxedFromString {
where
E: de::Error,
{
self.visit_string(s.to_owned())
Ok(RawValue::from_owned(s.to_owned().into_boxed_str()))
}

#[cfg(any(feature = "std", feature = "alloc"))]
fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
where
E: de::Error,
Expand Down
7 changes: 7 additions & 0 deletions src/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1548,6 +1548,13 @@ impl<'a, W: io::Write, F: Formatter> ser::Serializer for RawValueStrEmitter<'a,
) -> Result<Self::SerializeStructVariant> {
Err(ser::Error::custom("expected RawValue"))
}

fn collect_str<T>(self, value: &T) -> Result<Self::Ok>
where
T: ?Sized + Display,
{
self.serialize_str(&value.to_string())
}
}

/// Represents a character escape code in a type-safe manner.
Expand Down
7 changes: 7 additions & 0 deletions src/value/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1020,4 +1020,11 @@ impl serde::ser::Serializer for RawValueEmitter {
) -> Result<Self::SerializeStructVariant> {
Err(invalid_raw_value())
}

fn collect_str<T>(self, value: &T) -> Result<Self::Ok>
where
T: ?Sized + Display,
{
self.serialize_str(&value.to_string())
}
}

0 comments on commit 5fe9bdd

Please sign in to comment.