Skip to content

Commit 1f22b5f

Browse files
committed
Update serde implementation to use encode()/parse().
1 parent 79cf854 commit 1f22b5f

File tree

1 file changed

+45
-4
lines changed

1 file changed

+45
-4
lines changed

src/lib.rs

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,6 @@
103103
unused_qualifications
104104
)]
105105

106-
#[cfg(feature = "serde")]
107-
use serde::{Serialize, Deserialize};
108-
109106
mod errors;
110107
mod parser;
111108
use parser::{parse_captures, parse_captures_iter, Captures};
@@ -134,7 +131,6 @@ pub struct EncodeConfig {
134131

135132
/// A representation of Pem-encoded data
136133
#[derive(PartialEq, Debug, Clone)]
137-
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
138134
pub struct Pem {
139135
/// The tag extracted from the Pem-encoded data
140136
pub tag: String,
@@ -425,6 +421,51 @@ pub fn encode_many_config(pems: &[Pem], config: EncodeConfig) -> String {
425421
.join(line_ending)
426422
}
427423

424+
#[cfg(feature = "serde")]
425+
mod serde_impl {
426+
use super::{encode, parse, Pem};
427+
use serde::{
428+
de::{Error, Visitor},
429+
Deserialize, Serialize,
430+
};
431+
use std::fmt;
432+
433+
impl Serialize for Pem {
434+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
435+
where
436+
S: serde::Serializer,
437+
{
438+
serializer.serialize_str(&encode(self))
439+
}
440+
}
441+
442+
struct PemVisitor;
443+
444+
impl<'de> Visitor<'de> for PemVisitor {
445+
type Value = Pem;
446+
447+
fn expecting(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
448+
Ok(())
449+
}
450+
451+
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
452+
where
453+
E: Error,
454+
{
455+
parse(v).map_err(Error::custom)
456+
}
457+
}
458+
459+
impl<'de> Deserialize<'de> for Pem {
460+
fn deserialize<D>(deserializer: D) -> Result<Pem, D::Error>
461+
where
462+
D: serde::Deserializer<'de>,
463+
{
464+
deserializer.deserialize_str(PemVisitor)
465+
}
466+
}
467+
}
468+
428469
#[cfg(test)]
429470
mod test {
430471
use super::*;

0 commit comments

Comments
 (0)