mirror of https://codeberg.org/topola/topola.git
dsn: add support of keepouts
Includes some ugly hacks to get the deserializer to accept the relevant structs for now.
This commit is contained in:
parent
5b4f35b57e
commit
af1bb7069f
|
|
@ -604,7 +604,9 @@ impl<'de, 'a> SeqAccess<'de> for StructFields<'a, 'de> {
|
||||||
|
|
||||||
self.de.skip_ws();
|
self.de.skip_ws();
|
||||||
|
|
||||||
let ret = if field_name.ends_with("_vec") {
|
let ret = if field_name.ends_with("_anonymous") {
|
||||||
|
seed.deserialize(&mut *self.de).map(Some)
|
||||||
|
} else if field_name.ends_with("_vec") {
|
||||||
self.de.vec_type = field_name.strip_suffix("_vec");
|
self.de.vec_type = field_name.strip_suffix("_vec");
|
||||||
let value = seed.deserialize(&mut *self.de).map(Some);
|
let value = seed.deserialize(&mut *self.de).map(Some);
|
||||||
self.de.vec_type = None;
|
self.de.vec_type = None;
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ pub struct Image {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub outline_vec: Vec<Outline>,
|
pub outline_vec: Vec<Outline>,
|
||||||
pub pin_vec: Vec<Pin>,
|
pub pin_vec: Vec<Pin>,
|
||||||
|
pub keepout_vec: Vec<Keepout>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
|
|
@ -117,6 +118,12 @@ pub struct Pin {
|
||||||
pub y: f32,
|
pub y: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct Keepout {
|
||||||
|
pub idk: String,
|
||||||
|
pub shape_anonymous: Shape,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct Rotate {
|
pub struct Rotate {
|
||||||
pub angle: f32,
|
pub angle: f32,
|
||||||
|
|
@ -145,6 +152,8 @@ pub enum Shape {
|
||||||
pub struct Circle {
|
pub struct Circle {
|
||||||
pub layer: String,
|
pub layer: String,
|
||||||
pub diameter: u32,
|
pub diameter: u32,
|
||||||
|
#[serde(deserialize_with = "de_point_optional")]
|
||||||
|
pub offset: Option<Point>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
|
|
@ -200,13 +209,42 @@ pub struct Wire {
|
||||||
|
|
||||||
// This type isn't deserialized as is. Instead, Vec<Point> is converted from
|
// This type isn't deserialized as is. Instead, Vec<Point> is converted from
|
||||||
// what's effectively Vec<f32> (with even length) in the file.
|
// what's effectively Vec<f32> (with even length) in the file.
|
||||||
// Use #[serde(deserialize_with = "de_points")].
|
// Use #[serde(deserialize_with = "de_points")] for Vec<Point>
|
||||||
|
// and #[serde(deserialize_with = "de_point_optional")] for a single Point.
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Point {
|
pub struct Point {
|
||||||
pub x: f32,
|
pub x: f32,
|
||||||
pub y: f32,
|
pub y: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used to deserialize Option<Point>
|
||||||
|
fn de_point_optional<'de, D>(deserializer: D) -> Result<Option<Point>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let mut vec: Vec<Point> = Vec::<f32>::deserialize(deserializer)?
|
||||||
|
.chunks(2)
|
||||||
|
.map(|pair| {
|
||||||
|
// 0th index is guaranteed to exist by `.chunks()`
|
||||||
|
// (it ends iteration instead of emitting an empty Vec)
|
||||||
|
let x = pair[0];
|
||||||
|
// but if the file is malformed we may get an odd number of floats
|
||||||
|
let y = *pair.get(1).ok_or(Error::custom(
|
||||||
|
"expected paired x y coordinates, list ended at x",
|
||||||
|
))?;
|
||||||
|
|
||||||
|
Ok(Point { x, y })
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<Point>, D::Error>>()?;
|
||||||
|
|
||||||
|
if vec.len() > 1 {
|
||||||
|
Err(Error::custom("expected a single pair of coordinates"))
|
||||||
|
} else {
|
||||||
|
Ok(vec.pop())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Used to deserialize Vec<Point>.
|
// Used to deserialize Vec<Point>.
|
||||||
fn de_points<'de, D>(deserializer: D) -> Result<Vec<Point>, D::Error>
|
fn de_points<'de, D>(deserializer: D) -> Result<Vec<Point>, D::Error>
|
||||||
where
|
where
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue