Skip to main content

dada_ir_sym/check/inference/
serialize.rs

1use dada_ir_ast::span::Span;
2use serde::Serialize;
3
4use crate::{
5    check::red::{RedPerm, RedTy},
6    ir::indices::InferVarIndex,
7};
8
9use super::{InferenceVarBounds, InferenceVarData};
10
11// Stripped down version of `InferenceVarData` that excludes `ArcOrElse` objects.
12// Suitable for serialization and debugging.
13
14#[derive(Serialize)]
15struct InferenceVarDataExport<'a, 'db> {
16    span: Span<'db>,
17    bounds: InferenceVarBoundsExport<'a, 'db>,
18}
19
20#[derive(Serialize)]
21enum InferenceVarBoundsExport<'a, 'db> {
22    Perm {
23        lower: Vec<&'a RedPerm<'db>>,
24        upper: Vec<&'a RedPerm<'db>>,
25    },
26
27    Ty {
28        perm: InferVarIndex,
29        lower: Option<&'a RedTy<'db>>,
30        upper: Option<&'a RedTy<'db>>,
31    },
32}
33
34impl Serialize for InferenceVarData<'_> {
35    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
36    where
37        S: serde::Serializer,
38    {
39        let Self { span, bounds } = self;
40
41        let bounds = match bounds {
42            InferenceVarBounds::Perm { lower, upper } => InferenceVarBoundsExport::Perm {
43                lower: lower.iter().map(|pair| &pair.0).collect(),
44                upper: upper.iter().map(|pair| &pair.0).collect(),
45            },
46            InferenceVarBounds::Ty { perm, lower, upper } => InferenceVarBoundsExport::Ty {
47                perm: *perm,
48                lower: lower.as_ref().map(|pair| &pair.0),
49                upper: upper.as_ref().map(|pair| &pair.0),
50            },
51        };
52
53        let export = InferenceVarDataExport {
54            span: *span,
55            bounds,
56        };
57
58        Serialize::serialize(&export, serializer)
59    }
60}