summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2024-02-01 07:45:50 +0100
committerGitHub <noreply@github.com>2024-02-01 07:45:50 +0100
commit37cc6cf37a29be1450701f9e16a9cf9e9a21f0f5 (patch)
treeda1fb10043c08b94e4f73e788a9f4130df204cfb
parentba729213b4dd23fe744505b47b84ac960befcb59 (diff)
parent9a18f60db256df9f5dd01a91ee58041e4ca759e1 (diff)
Merge pull request #490 from ijackson/deser-string-unreachable
deserialize: strings: Introduce Unreachable type
-rw-r--r--src/ser.rs61
1 files changed, 32 insertions, 29 deletions
diff --git a/src/ser.rs b/src/ser.rs
index 49b607b..1c16098 100644
--- a/src/ser.rs
+++ b/src/ser.rs
@@ -19,6 +19,9 @@ enum SerKey {
Seq(usize),
}
+/// An uninhabited type: no values like this can ever exist!
+pub enum Unreachable {}
+
/// Serializer for numbered sequences
///
/// This wrapper is present when we are outputting a sequence (numbered indices).
@@ -427,13 +430,13 @@ macro_rules! string_serialize_via_display { { $method:ident, $type:ty } => {
impl ser::Serializer for StringKeySerializer {
type Ok = String;
type Error = ConfigError;
- type SerializeSeq = Self;
- type SerializeTuple = Self;
- type SerializeTupleStruct = Self;
- type SerializeTupleVariant = Self;
- type SerializeMap = Self;
- type SerializeStruct = Self;
- type SerializeStructVariant = Self;
+ type SerializeSeq = Unreachable;
+ type SerializeTuple = Unreachable;
+ type SerializeTupleStruct = Unreachable;
+ type SerializeTupleVariant = Unreachable;
+ type SerializeMap = Unreachable;
+ type SerializeStruct = Unreachable;
+ type SerializeStructVariant = Unreachable;
string_serialize_via_display!(serialize_bool, bool);
string_serialize_via_display!(serialize_i8, i8);
@@ -560,7 +563,7 @@ impl ser::Serializer for StringKeySerializer {
}
}
-impl ser::SerializeSeq for StringKeySerializer {
+impl ser::SerializeSeq for Unreachable {
type Ok = String;
type Error = ConfigError;
@@ -568,15 +571,15 @@ impl ser::SerializeSeq for StringKeySerializer {
where
T: ?Sized + ser::Serialize,
{
- unreachable!()
+ match *self {}
}
fn end(self) -> Result<Self::Ok> {
- unreachable!()
+ match self {}
}
}
-impl ser::SerializeTuple for StringKeySerializer {
+impl ser::SerializeTuple for Unreachable {
type Ok = String;
type Error = ConfigError;
@@ -584,15 +587,15 @@ impl ser::SerializeTuple for StringKeySerializer {
where
T: ?Sized + ser::Serialize,
{
- unreachable!()
+ match *self {}
}
fn end(self) -> Result<Self::Ok> {
- unreachable!()
+ match self {}
}
}
-impl ser::SerializeTupleStruct for StringKeySerializer {
+impl ser::SerializeTupleStruct for Unreachable {
type Ok = String;
type Error = ConfigError;
@@ -600,15 +603,15 @@ impl ser::SerializeTupleStruct for StringKeySerializer {
where
T: ?Sized + ser::Serialize,
{
- unreachable!()
+ match *self {}
}
fn end(self) -> Result<Self::Ok> {
- unreachable!()
+ match self {}
}
}
-impl ser::SerializeTupleVariant for StringKeySerializer {
+impl ser::SerializeTupleVariant for Unreachable {
type Ok = String;
type Error = ConfigError;
@@ -616,15 +619,15 @@ impl ser::SerializeTupleVariant for StringKeySerializer {
where
T: ?Sized + ser::Serialize,
{
- unreachable!()
+ match *self {}
}
fn end(self) -> Result<Self::Ok> {
- unreachable!()
+ match self {}
}
}
-impl ser::SerializeMap for StringKeySerializer {
+impl ser::SerializeMap for Unreachable {
type Ok = String;
type Error = ConfigError;
@@ -632,22 +635,22 @@ impl ser::SerializeMap for StringKeySerializer {
where
T: ?Sized + ser::Serialize,
{
- unreachable!()
+ match *self {}
}
fn serialize_value<T>(&mut self, _value: &T) -> Result<()>
where
T: ?Sized + ser::Serialize,
{
- unreachable!()
+ match *self {}
}
fn end(self) -> Result<Self::Ok> {
- unreachable!()
+ match self {}
}
}
-impl ser::SerializeStruct for StringKeySerializer {
+impl ser::SerializeStruct for Unreachable {
type Ok = String;
type Error = ConfigError;
@@ -655,15 +658,15 @@ impl ser::SerializeStruct for StringKeySerializer {
where
T: ?Sized + ser::Serialize,
{
- unreachable!()
+ match *self {}
}
fn end(self) -> Result<Self::Ok> {
- unreachable!()
+ match self {}
}
}
-impl ser::SerializeStructVariant for StringKeySerializer {
+impl ser::SerializeStructVariant for Unreachable {
type Ok = String;
type Error = ConfigError;
@@ -671,11 +674,11 @@ impl ser::SerializeStructVariant for StringKeySerializer {
where
T: ?Sized + ser::Serialize,
{
- unreachable!()
+ match *self {}
}
fn end(self) -> Result<Self::Ok> {
- unreachable!()
+ match self {}
}
}