use std::fs::File;
use std::io;

use crate::towasm::collect::datatype::Value;
use crate::towasm::collect::Type;
use crate::towasm::values::Expression;
use crate::towasm::Wasm;

pub struct Const {
    pub typ: Type,
    value: Value,
}

impl Const {
    pub fn new(typ: Type, value: Value) -> Box<Self> {
        assert!(value.is_type(typ));
        Box::new(Const { typ, value })
    }
}

impl Wasm for Const {
    fn as_wat(&self) -> String {
        format!("{}.const {}", self.typ.as_wat(), self.value.as_wat())
    }

    fn write_wasm(&self, _file: &mut File) -> io::Result<()> {
        unimplemented!()
    }
}

impl Expression for Const {
    fn typ(&self) -> &Type {
        &self.typ
    }
}
