use std::io::Error;

use envl_codeblock::code_block;
use envl_utils::variable::Value;
use proc_macro2::{Literal, TokenStream};
use quote::ToTokens;

use crate::generator::js::{gen_array::gen_array, gen_struct::gen_struct};

pub(crate) fn gen_value(v: Value) -> Result<TokenStream, Error> {
    match &v {
        Value::Null => Ok(code_block! {null}),
        Value::String(s) => Ok(code_block! {#s}),
        Value::Char(c) => Ok(code_block! {#c}),
        Value::Float(f) => Ok(Literal::f64_unsuffixed(*f).into_token_stream()),
        Value::Int(i) => Ok(Literal::i64_unsuffixed(*i).to_token_stream()),
        Value::Uint(u) => Ok(Literal::u64_unsuffixed(*u).to_token_stream()),
        Value::Bool(b) => Ok(code_block! {#b}),
        Value::Array(a) => gen_array(a.to_owned()),
        Value::Struct(value) => gen_struct(value.to_owned()),
    }
}
