dada_ir_sym/check/inference/
serialize.rs1use 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#[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}