use crate::basetype::BaseType;
use crate::{aperror, langc, langrust, table};
use std::fs;
use std::path::Path;
pub trait Language {
fn emit(&self, project: &table::Project) -> aperror::Result<()>;
fn extension(&self) -> String;
fn dst_modified(&self, project: &table::Project) -> aperror::Result<std::time::SystemTime> {
let metadata = fs::metadata(&project.dst_path)?;
let modified = metadata.modified()?;
Ok(modified)
}
fn to_label(&self) -> bool {
false
}
fn emit_enum(&self, _typ: &BaseType, _label: &str) -> String {
"TO LABEL UNSUPORTED".to_string()
}
}
pub fn language_for_dest(filename: &Path) -> &'static dyn Language {
match filename
.extension()
.unwrap_or_default()
.to_str()
.unwrap_or_default()
{
"rs" => langrust::RUST,
"c" => langc::LANG_C,
_ => langrust::RUST,
}
}
pub fn digits(n: usize) -> usize {
if n == 0 {
1
} else {
let t = n as f64;
t.log10().ceil() as usize
}
}
pub fn file_notice() -> String {
const VERSION: &str = env!("CARGO_PKG_VERSION");
format!("generated by insrcdata version {}", VERSION)
}