|
103 | 103 | unused_qualifications
|
104 | 104 | )]
|
105 | 105 |
|
106 |
| -#[cfg(feature = "serde")] |
107 |
| -use serde::{Serialize, Deserialize}; |
108 |
| - |
109 | 106 | mod errors;
|
110 | 107 | mod parser;
|
111 | 108 | use parser::{parse_captures, parse_captures_iter, Captures};
|
@@ -134,7 +131,6 @@ pub struct EncodeConfig {
|
134 | 131 |
|
135 | 132 | /// A representation of Pem-encoded data
|
136 | 133 | #[derive(PartialEq, Debug, Clone)]
|
137 |
| -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] |
138 | 134 | pub struct Pem {
|
139 | 135 | /// The tag extracted from the Pem-encoded data
|
140 | 136 | pub tag: String,
|
@@ -425,6 +421,51 @@ pub fn encode_many_config(pems: &[Pem], config: EncodeConfig) -> String {
|
425 | 421 | .join(line_ending)
|
426 | 422 | }
|
427 | 423 |
|
| 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 | + |
428 | 469 | #[cfg(test)]
|
429 | 470 | mod test {
|
430 | 471 | use super::*;
|
|
0 commit comments