lib: split converter mod into files

master
Sameer Puri 4 years ago
parent da3eee654b
commit 50cae5c962

@ -0,0 +1,77 @@
use serde::{
de::{SeqAccess, Visitor},
ser::SerializeSeq,
Deserialize, Deserializer, Serialize, Serializer,
};
use svgtypes::{Length, LengthUnit};
pub fn serialize<S>(length: &[Option<Length>; 2], serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(2))?;
for i in 0..2 {
let length_def = length[i].clone().map(|length| LengthDef {
number: length.number,
unit: length.unit,
});
seq.serialize_element(&length_def)?;
}
seq.end()
}
struct OptionalLengthArrayVisitor;
impl<'de> Visitor<'de> for OptionalLengthArrayVisitor {
type Value = [Option<Length>; 2];
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(formatter, "SVG dimension array")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let x = seq.next_element::<Option<LengthDef>>()?.flatten();
let y = seq.next_element::<Option<LengthDef>>()?.flatten();
Ok([
x.map(|length_def| Length {
number: length_def.number,
unit: length_def.unit,
}),
y.map(|length_def| Length {
number: length_def.number,
unit: length_def.unit,
}),
])
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<[Option<Length>; 2], D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(OptionalLengthArrayVisitor)
}
#[derive(Serialize, Deserialize)]
struct LengthDef {
number: f64,
#[serde(with = "LengthUnitDef")]
unit: LengthUnit,
}
#[derive(Serialize, Deserialize)]
#[serde(remote = "LengthUnit")]
enum LengthUnitDef {
None,
Em,
Ex,
Px,
In,
Cm,
Mm,
Pt,
Pc,
Percent,
}

@ -17,6 +17,9 @@ use svgtypes::{
use crate::turtle::*; use crate::turtle::*;
#[cfg(feature = "serde")]
mod length_serde;
const SVG_TAG_NAME: &str = "svg"; const SVG_TAG_NAME: &str = "svg";
/// High-level output configuration /// High-level output configuration
@ -54,86 +57,6 @@ pub struct ConversionOptions {
pub dimensions: [Option<Length>; 2], pub dimensions: [Option<Length>; 2],
} }
#[cfg(feature = "serde")]
mod length_serde {
use serde::{
de::{SeqAccess, Visitor},
ser::SerializeSeq,
Deserialize, Deserializer, Serialize, Serializer,
};
use svgtypes::{Length, LengthUnit};
pub fn serialize<S>(length: &[Option<Length>; 2], serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(2))?;
for i in 0..2 {
let length_def = length[i].clone().map(|length| LengthDef {
number: length.number,
unit: length.unit,
});
seq.serialize_element(&length_def)?;
}
seq.end()
}
struct OptionalLengthArrayVisitor;
impl<'de> Visitor<'de> for OptionalLengthArrayVisitor {
type Value = [Option<Length>; 2];
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(formatter, "SVG dimension array")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let x = seq.next_element::<Option<LengthDef>>()?.flatten();
let y = seq.next_element::<Option<LengthDef>>()?.flatten();
Ok([
x.map(|length_def| Length {
number: length_def.number,
unit: length_def.unit,
}),
y.map(|length_def| Length {
number: length_def.number,
unit: length_def.unit,
}),
])
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<[Option<Length>; 2], D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(OptionalLengthArrayVisitor)
}
#[derive(Serialize, Deserialize)]
struct LengthDef {
number: f64,
#[serde(with = "LengthUnitDef")]
unit: LengthUnit,
}
#[derive(Serialize, Deserialize)]
#[serde(remote = "LengthUnit")]
enum LengthUnitDef {
None,
Em,
Ex,
Px,
In,
Cm,
Mm,
Pt,
Pc,
Percent,
}
}
pub fn svg2program<'input>( pub fn svg2program<'input>(
doc: &Document, doc: &Document,
Loading…
Cancel
Save