use crate::emit::decode;
use crate::emit::java::Java;
use crate::encode::EncodeError;
use zerodds_ast::{Ast, TypeNode};
use zerodds_ast_core::Id;
use zerodds_ast_layout::key::LayoutKey;
use zerodds_lang_cst::java;
pub use crate::emit::encode::CodecOptions as JavaCodecOptions;
#[must_use]
pub fn decoder_name(ast: &Ast, id: Id<TypeNode>) -> String {
decode::decoder_name::<Java>(ast, id)
}
pub fn java_decoder(
ast: &Ast,
key: LayoutKey,
options: JavaCodecOptions,
) -> Result<Vec<java::Member>, EncodeError> {
with_defaulters(ast, decode::decoder::<Java>(ast, key, options)?)
}
pub fn java_decoder_from(
ast: &Ast,
root: Id<TypeNode>,
key: LayoutKey,
options: JavaCodecOptions,
) -> Result<Vec<java::Member>, EncodeError> {
with_defaulters(ast, decode::decoder_from::<Java>(ast, root, key, options)?)
}
fn with_defaulters(
ast: &Ast,
decoders: Vec<java::Member>,
) -> Result<Vec<java::Member>, EncodeError> {
let mut out = crate::default_java::java_defaulters_called_by(ast, &decoders)?;
out.extend(decoders);
Ok(out)
}