dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
"regex",
"rustc-hash",
"shlex",
- "syn",
+ "syn 2.0.117",
]
[[package]]
name = "binrw"
-version = "0.15.0"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81419ff39e6ed10a92a7f125290859776ced35d9a08a665ae40b23e7ca702f30"
+checksum = "6ad120d555272286c1017d25165ab8bd74806f13fc85b258484ec7e4ce75458f"
dependencies = [
"array-init",
"binrw_derive",
[[package]]
name = "binrw_derive"
-version = "0.15.0"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "376404e55ec40d0d6f8b4b7df3f87b87954bd987f0cf9a7207ea3b6ea5c9add4"
+checksum = "6df92e0e9baae4dc82c7bad7715ca40c0a5c71539057bf2ea04a5c29c980410b"
dependencies = [
"either",
"owo-colors",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
"heck",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
"ident_case",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"darling_core",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
"unicode-xid",
]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9"
dependencies = [
- "enum-map-derive",
+ "enum-map-derive 0.17.0",
+ "serde",
+]
+
+[[package]]
+name = "enum-map"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4532960034c15ba2f55e9eee631040ecc473c32e6c4b200828c759840f13a06"
+dependencies = [
+ "enum-map-derive 1.0.1",
"serde",
]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
+]
+
+[[package]]
+name = "enum-map-derive"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7127272f64b3e098f7d81f350d672081b879bff896d219c42370dc858b1af9ff"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.3",
]
[[package]]
"darling",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
"heck",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
"pest_meta",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
"phf_shared 0.11.3",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55"
dependencies = [
"proc-macro2",
- "syn",
+ "syn 2.0.117",
]
[[package]]
name = "proc-macro2"
-version = "1.0.95"
+version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
"unicode-ident",
]
"either",
"encoding_rs",
"enum-iterator",
- "enum-map",
+ "enum-map 2.7.3",
+ "enum-map 3.1.0",
"enumset",
"erased-serde",
"flate2",
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
[[package]]
name = "quote"
-version = "1.0.40"
+version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
[[package]]
name = "serde"
-version = "1.0.228"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
dependencies = [
"serde_core",
"serde_derive",
[[package]]
name = "serde_core"
-version = "1.0.228"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.228"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 3.0.3",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
"unicode-ident",
]
+[[package]]
+name = "syn"
+version = "3.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
[[package]]
name = "synstructure"
version = "0.13.2"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
"log",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
"wasm-bindgen-shared",
]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
"synstructure",
]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
"synstructure",
]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.117",
]
[[package]]
aes = "0.8.4"
anyhow = "1.0.69"
base64 = "0.22.1"
-binrw = "0.15.0"
+binrw = "0.15.2"
bit-vec = "0.8.0"
cairo-rs = { version = "0.22.0", features = ["ps", "png", "pdf", "svg"] }
chardetng = "0.1.17"
either = "1.13.0"
encoding_rs = { version = "0.8.32", features = ["serde"] }
enum-iterator = "2.1.0"
-enum-map = { version = "2.7.3", features = ["serde"] }
+enum-map = { version = "3.1.0", features = ["serde"] }
enumset = "1.1.10"
erased-serde = "0.4.9"
flate2 = "1.0.26"
Arc::new({
let mut look = Look::default().with_borders(EnumMap::from_fn(|_| BorderStyle::none()));
for style in look.areas.values_mut() {
- style.cell_style.margins = EnumMap::from_fn(|_| [0, 0]);
+ style.cell_style.margins = EnumMap::default();
}
look
})
axis_domains: &mut EnumMap<Axis3, AxisDomain<'a>>,
styles: &'a HashMap<String, Style>,
) -> Result<Self, GraphError> {
- let mut variables = EnumMap::default();
- for (coordinate, axis) in
- [&raw.x, &raw.y, &raw.z]
- .into_iter()
- .zip([Axis3::X, Axis3::Y, Axis3::Z])
- {
- if let Some(coordinate) = &coordinate {
- let series = series
- .get(coordinate.variable.as_str())
- .ok_or_else(|| GraphError::MissingVariable(coordinate.variable.clone()))?;
- variables[axis] = Some(series.clone());
- }
- }
+ let mut variables = EnumMap::try_from_fn(|axis| {
+ raw.positions[axis]
+ .as_ref()
+ .map(|coordinate| {
+ series
+ .get(coordinate.variable.as_str())
+ .cloned()
+ .ok_or_else(|| GraphError::MissingVariable(coordinate.variable.clone()))
+ })
+ .transpose()
+ })?;
let mut ignore_minmax = EnumMap::default();
for statistic in &raw.statistics {
match statistic {
Wings,
}
-#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum Graphic {
/// Bar chart of bars. Each `(x,y)` bar covers `0..y` at the given `x`
/// coordinate.
- #[default]
Interval,
/// Scatter-plot of `(x,y)` points.
Point,
Polygon,
}
-#[derive(Deserialize, Debug, Default)]
-#[serde(rename_all = "camelCase")]
-#[serde(default)]
+#[derive(Debug)]
struct RawElement {
- #[serde(rename = "@id")]
id: Option<String>,
-
- #[serde(rename = "@breakRepresentation")]
break_representation: Option<BreakRepresentation>,
-
- #[serde(rename = "@closed")]
closed: bool,
-
- #[serde(rename = "@preserveStraightLines")]
preserve_straight_lines: bool,
-
- #[serde(rename = "@centerIn3D")]
center_in_3d: bool,
-
- #[serde(rename = "@medianStyle")]
median_style: Option<String>,
-
- #[serde(rename = "@fenceStyle")]
fence_style: Option<String>,
-
- #[serde(rename = "@hingeStyle")]
hinge_style: Option<String>,
-
- #[serde(rename = "@outlierStyle")]
outlier_style: Option<String>,
-
- #[serde(rename = "@extremeStyle")]
extreme_style: Option<String>,
-
- #[serde(rename = "@style")]
style: Option<String>,
-
- #[serde(rename = "$value")]
statistics: Vec<Statistic>,
- position: Vec<Coordinate>,
- x: Option<Coordinate>,
- y: Option<Coordinate>,
- z: Option<Coordinate>,
+ positions: EnumMap<Axis3, Option<Coordinate>>,
color: Vec<ColorAesthetic>,
style_by: Vec<StyleBy>,
/// Type of graphic.
- #[serde(skip)]
graphic: Graphic,
}
self.graphic = graphic;
self
}
- fn coordinate(&self, index: usize) -> Option<&Coordinate> {
- match index {
- 0 => self.x.as_ref(),
- 1 => self.y.as_ref(),
- 2 => self.z.as_ref(),
- _ => None,
+}
+
+impl<'de> Deserialize<'de> for RawElement {
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ #[derive(Deserialize, Debug, Default)]
+ #[serde(rename_all = "camelCase")]
+ #[serde(default)]
+ struct ElementSpec {
+ #[serde(rename = "@id")]
+ id: Option<String>,
+
+ #[serde(rename = "@breakRepresentation")]
+ break_representation: Option<BreakRepresentation>,
+
+ #[serde(rename = "@closed")]
+ closed: bool,
+
+ #[serde(rename = "@preserveStraightLines")]
+ preserve_straight_lines: bool,
+
+ #[serde(rename = "@centerIn3D")]
+ center_in_3d: bool,
+
+ #[serde(rename = "@medianStyle")]
+ median_style: Option<String>,
+
+ #[serde(rename = "@fenceStyle")]
+ fence_style: Option<String>,
+
+ #[serde(rename = "@hingeStyle")]
+ hinge_style: Option<String>,
+
+ #[serde(rename = "@outlierStyle")]
+ outlier_style: Option<String>,
+
+ #[serde(rename = "@extremeStyle")]
+ extreme_style: Option<String>,
+
+ #[serde(rename = "@style")]
+ style: Option<String>,
+
+ #[serde(rename = "$value")]
+ statistics: Vec<Statistic>,
+
+ /// `position` is just a generic way to say x, y, z
+ position: Vec<Coordinate>,
+ x: Option<Coordinate>,
+ y: Option<Coordinate>,
+ z: Option<Coordinate>,
+ color: Vec<ColorAesthetic>,
+ style_by: Vec<StyleBy>,
+ }
+
+ let raw = ElementSpec::deserialize(deserializer)?;
+ let mut positions = EnumMap::from_array([raw.x, raw.y, raw.z]);
+ for (position, axis) in zip(raw.position, all()) {
+ positions[axis] = Some(position);
}
+ Ok(Self {
+ id: raw.id,
+ break_representation: raw.break_representation,
+ closed: raw.closed,
+ preserve_straight_lines: raw.preserve_straight_lines,
+ center_in_3d: raw.center_in_3d,
+ median_style: raw.median_style,
+ fence_style: raw.fence_style,
+ hinge_style: raw.hinge_style,
+ outlier_style: raw.outlier_style,
+ extreme_style: raw.extreme_style,
+ style: raw.style,
+ statistics: raw.statistics,
+ positions,
+ color: raw.color,
+ style_by: raw.style_by,
+ graphic: Graphic::Area,
+ })
}
}
#[derive(Debug)]
pub struct Frame<'a> {
- id: Option<String>,
frame_type: FrameType<'a>,
parent: Option<usize>,
children: Vec<usize>,
}
impl<'a> Frame<'a> {
+ fn new(frame_type: FrameType<'a>, parent: Option<usize>) -> Self {
+ Self {
+ frame_type,
+ parent,
+ children: Vec::new(),
+ locations: EnumMap::default(),
+ position: EnumMap::default(),
+ }
+ }
fn children(&self, frames: &'a [Frame<'a>]) -> impl Iterator<Item = &'a Frame<'a>> {
self.children.iter().copied().map(|index| &frames[index])
}
}
fn try_from_fn<E>(f: impl Fn(Axis2) -> Result<Span, E>) -> Result<Self, E> {
- let mut map = EnumMap::default();
- map[Axis2::X] = f(Axis2::X)?;
- map[Axis2::Y] = f(Axis2::Y)?;
- Ok(Self(map))
+ Ok(Self(EnumMap::try_from_fn(|axis| f(axis))?))
}
/// Returns a demerits score based on how much this rectangle overflows the
impl Visualization {
pub fn decode_frames<'a>(&'a self) -> Frames<'a> {
- let mut frames = Vec::new();
+ let mut frames = vec![Frame::new(FrameType::Visualization(self), None)];
let mut ids = HashMap::new();
- frames.push(Frame {
- id: self.id.clone(),
- frame_type: FrameType::Visualization(self),
- parent: None,
- children: Vec::new(),
- locations: EnumMap::default(),
- position: EnumMap::default(),
- });
fn decode_container<'a>(
parent: usize,
container: &'a Container,
if let Some(id) = &container.id {
ids.insert(id, container_index);
}
- frames.push(Frame {
- id: container.id.clone(),
- frame_type: FrameType::Container(container),
- parent: Some(parent),
- children: Vec::new(),
- locations: EnumMap::default(),
- position: EnumMap::default(),
- });
+ frames.push(Frame::new(FrameType::Container(container), Some(parent)));
for child in &container.children {
match child {
AnyFrame::Graph(graph) => {
if let Some(id) = &graph.id {
ids.insert(id, index);
}
- frames.push(Frame {
- id: graph.id.clone(),
- frame_type: FrameType::Graph(graph),
- parent: Some(container_index),
- children: Vec::new(),
- locations: EnumMap::default(),
- position: EnumMap::default(),
- });
+ frames.push(Frame::new(FrameType::Graph(graph), Some(container_index)));
}
AnyFrame::LabelFrame(label_frame) => {
let index = frames.len();
if let Some(id) = &label_frame.id {
ids.insert(id, index);
}
- frames.push(Frame {
- id: label_frame.id.clone(),
- frame_type: FrameType::LabelFrame(label_frame),
- parent: Some(container_index),
- children: Vec::new(),
- locations: EnumMap::default(),
- position: EnumMap::default(),
- });
+ frames.push(Frame::new(
+ FrameType::LabelFrame(label_frame),
+ Some(container_index),
+ ));
}
AnyFrame::Legend(legend) => {
let index = frames.len();
if let Some(id) = &legend.id {
ids.insert(id, index);
}
- frames.push(Frame {
- id: legend.id.clone(),
- frame_type: FrameType::Legend(legend),
- parent: Some(container_index),
- children: Vec::new(),
- locations: EnumMap::default(),
- position: EnumMap::default(),
- });
+ frames.push(Frame::new(FrameType::Legend(legend), Some(container_index)));
}
AnyFrame::Container(container) => {
decode_container(container_index, container, frames, ids)
if let Some(id) = &graph.id {
ids.insert(id, index);
}
- frames.push(Frame {
- id: graph.id.clone(),
- frame_type: FrameType::Graph(graph),
- parent: Some(0),
- children: Vec::new(),
- locations: EnumMap::default(),
- position: EnumMap::default(),
- });
+ frames.push(Frame::new(FrameType::Graph(graph), Some(0)));
}
AnyFrame::LabelFrame(label_frame) => {
let index = frames.len();
if let Some(id) = &label_frame.id {
ids.insert(id, index);
}
- frames.push(Frame {
- id: label_frame.id.clone(),
- frame_type: FrameType::LabelFrame(label_frame),
- parent: Some(0),
- children: Vec::new(),
- locations: EnumMap::default(),
- position: EnumMap::default(),
- });
+ frames.push(Frame::new(FrameType::LabelFrame(label_frame), Some(0)));
}
AnyFrame::Container(container) => {
decode_container(0, container, &mut frames, &mut ids)
}
impl<'a> FrameType<'a> {
+ fn id(&self) -> &Option<String> {
+ match self {
+ FrameType::Visualization(visualization) => &visualization.id,
+ FrameType::Container(container) => &container.id,
+ FrameType::Graph(graph) => &graph.id,
+ FrameType::LabelFrame(label_frame) => &label_frame.id,
+ FrameType::Legend(legend) => &legend.id,
+ }
+ }
+
fn preferred_size(&self, max: &EnumMap<Axis2, Option<f64>>) -> EnumMap<Axis2, f64> {
let default = match self {
FrameType::Visualization(_) | FrameType::Container(_) => EnumMap::default(),
.set("height", height)
.set("fill", "none")
.set("stroke", "red");
- if let Some(id) = &frame.id {
+ if let Some(id) = frame.frame_type.id() {
rectangle.append(Title::new(id));
}
group.append(rectangle);