1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use std::{
    collections::HashMap,
    fs::{create_dir_all, File},
    io::Write,
    path::Path,
};

use convert_case::{Case, Casing};
use itertools::Itertools;
use serde::Serialize;
use serde_json::Value;
use tera::{Context, Tera};

use xcell_errors::XResult;
use xcell_types::{
    codegen::{CSharpReader, CSharpWriter},
    ByteOrder, StreamWriter, XCellValue,
};

use crate::{BinaryWriter, DataContractWriter, MergedTable, UnityCodegen, XCellHeader, XDataItem, XTable, XTableKind};

pub mod binary;
pub mod readable;
pub mod unity;
pub mod xml;

pub struct CsvCodegen {}

fn tera_render(template: &str, slots: &Context, output: &Path, name: &str) -> XResult<String> {
    let mut file = File::create(output)?;
    let mut tera = Tera::default();
    tera.add_raw_template(name, &template.replace("\r\n", "\n")).unwrap();
    tera.register_filter("public_name", public_name);
    tera.register_filter("private_name", private_name);
    let result = tera.render(name, slots).unwrap();
    file.write_all(result.as_bytes())?;
    Ok(result)
}

fn public_name(input: &Value, _: &HashMap<String, Value>) -> tera::Result<Value> {
    let name = input.as_str().ok_or("Not String")?;
    Ok(Value::String(name.to_case(Case::Camel)))
}

fn private_name(input: &Value, _: &HashMap<String, Value>) -> tera::Result<Value> {
    let name = input.as_str().ok_or("Not String")?;
    Ok(Value::String(format!("_{}", name.to_case(Case::Snake))))
}