Skip to content

Commit 0b37bd8

Browse files
authored
Merge pull request #34 from tmpfs/serde-feature
Support optional serde feature
2 parents 2ebf2b1 + 6381ef4 commit 0b37bd8

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ rust-version = "1.34.2"
1414

1515
[dependencies]
1616
base64 = "0.13.0"
17+
serde = { version = "1", optional = true, features = ["serde_derive"] }
1718

1819
[dev-dependencies]
1920
criterion = "0.3.0"
21+
serde_json = "1"
2022

2123
[[bench]]
2224
name = "pem_benchmark"

src/lib.rs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
//!
2020
//! ```toml
2121
//! [dependencies]
22-
//! pem = "0.8"
22+
//! pem = "1"
2323
//! ```
2424
//!
2525
//! and this to your crate root:
@@ -28,6 +28,9 @@
2828
//! extern crate pem;
2929
//! ```
3030
//!
31+
//! Using the `serde` feature will implement the serde traits for
32+
//! the `Pem` struct.
33+
//!
3134
//! # Example: parse a single chunk of PEM-encoded text
3235
//!
3336
//! Generally, PEM-encoded files contain a single chunk of PEM-encoded
@@ -421,6 +424,51 @@ pub fn encode_many_config(pems: &[Pem], config: EncodeConfig) -> String {
421424
.join(line_ending)
422425
}
423426

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

614662
assert_eq!(SAMPLE_LF, encoded);
615663
}
664+
665+
#[cfg(feature = "serde")]
666+
#[test]
667+
fn test_serde() {
668+
let pem = Pem {
669+
tag: String::from("Mock tag"),
670+
contents: "Mock contents".as_bytes().to_vec(),
671+
};
672+
let value = serde_json::to_string_pretty(&pem).unwrap();
673+
let result = serde_json::from_str(&value).unwrap();
674+
assert_eq!(pem, result);
675+
}
616676
}

0 commit comments

Comments
 (0)