use crate::emit::cpp::Cpp;
use crate::emit::decode;
use crate::encode::EncodeError;
use zerodds_ast::{Ast, TypeNode};
use zerodds_ast_core::Id;
use zerodds_ast_layout::key::LayoutKey;
use zerodds_lang_cst::cpp;
pub use crate::emit::encode::CodecOptions as CppCodecOptions;
#[must_use]
pub fn decoder_name(ast: &Ast, id: Id<TypeNode>) -> String {
decode::decoder_name::<Cpp>(ast, id)
}
pub fn cpp_decoder(
ast: &Ast,
key: LayoutKey,
options: CppCodecOptions,
) -> Result<Vec<cpp::Decl>, EncodeError> {
with_defaulters(ast, decode::decoder::<Cpp>(ast, key, options)?)
}
pub fn cpp_decoder_from(
ast: &Ast,
root: Id<TypeNode>,
key: LayoutKey,
options: CppCodecOptions,
) -> Result<Vec<cpp::Decl>, EncodeError> {
with_defaulters(ast, decode::decoder_from::<Cpp>(ast, root, key, options)?)
}
pub fn cpp_decoder_from_many(
ast: &Ast,
roots: &[Id<TypeNode>],
key: LayoutKey,
options: CppCodecOptions,
) -> Result<Vec<cpp::Decl>, EncodeError> {
with_defaulters(
ast,
decode::decoder_from_many::<Cpp>(ast, roots, key, options)?,
)
}
pub fn cpp_decoder_from_many_excluding(
ast: &Ast,
roots: &[Id<TypeNode>],
key: LayoutKey,
options: CppCodecOptions,
excluded: &[Id<TypeNode>],
) -> Result<Vec<cpp::Decl>, EncodeError> {
let decoders = decode::decoder_from_many_excluding::<Cpp>(ast, roots, key, options, excluded)?;
let mut out = crate::default_cpp::cpp_defaulters_called_by_excluding(ast, &decoders, excluded)?;
out.extend(decoders);
Ok(out)
}
fn with_defaulters(ast: &Ast, decoders: Vec<cpp::Decl>) -> Result<Vec<cpp::Decl>, EncodeError> {
let mut out = crate::default_cpp::cpp_defaulters_called_by(ast, &decoders)?;
out.extend(decoders);
Ok(out)
}