dust-lang 0.4.2

General purpose programming language
use std::fmt::{self, Display, Formatter};

use serde::{ser::SerializeMap, Serialize, Serializer};

use crate::{Identifier, Map};

#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
pub struct StructInstance {
    name: Identifier,
    map: Map,
}

impl StructInstance {
    pub fn new(name: Identifier, map: Map) -> Self {
        StructInstance { name, map }
    }
}

impl Display for StructInstance {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        writeln!(f, "{{")?;

        for (key, value) in self.map.inner() {
            writeln!(f, "  {key} <{}> = {value}", value.r#type().unwrap())?;
        }

        write!(f, "}}")
    }
}

impl Serialize for StructInstance {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let map = self.map.inner();
        let mut serde_map = serializer.serialize_map(Some(map.len()))?;

        for (key, value) in map.iter() {
            serde_map.serialize_entry(key, value)?;
        }

        serde_map.end()
    }
}