crate::ix!();
pub fn generate_impl_get_batch_workspace(parsed: &LmbwParsedInput) -> TokenStream2 {
trace!("generate_impl_get_batch_workspace: start.");
let struct_ident = parsed.struct_ident();
let (impl_generics, ty_generics, where_clause) = parsed.generics().split_for_impl();
if let Some(w) = &parsed.batch_workspace_field() {
quote! {
impl #impl_generics GetBatchWorkspace<BatchWorkspaceError, <#struct_ident #ty_generics as ComputeLanguageModelCoreQuery>::Seed>
for #struct_ident #ty_generics #where_clause
{
fn workspace(&self)
-> ::std::sync::Arc<dyn FullBatchWorkspaceInterface<BatchWorkspaceError, <#struct_ident #ty_generics as ComputeLanguageModelCoreQuery>::Seed>>
{
trace!("Returning batch workspace arc for FullBatchWorkspaceInterface with E/I generics.");
self.#w.clone()
}
}
}
} else {
quote! {}
}
}
#[cfg(test)]
mod test_generate_impl_get_batch_workspace {
use super::*;
#[traced_test]
fn generates_impl_if_present() {
info!("Starting generates_impl_if_present test for GetBatchWorkspace.");
let ast: DeriveInput = parse_quote! {
#[batch_error_type(MyErr)]
struct Dummy {
#[batch_client]
some_client: std::sync::Arc<OpenAIClientHandle>,
#[batch_workspace]
some_workspace: std::sync::Arc<BatchWorkspace>,
#[model_type]
mt: LanguageModelType,
}
};
let parsed = match parse_derive_input_for_lmbw(&ast) {
Ok(x) => x,
Err(e) => panic!("Expected parse to succeed but got error: {e}"),
};
let tokens = generate_impl_get_batch_workspace(&parsed);
let code = tokens.to_string();
debug!("Generated code: {}", code);
assert!(
code.contains("impl GetBatchWorkspace < BatchWorkspaceError , < Dummy as ComputeLanguageModelCoreQuery > :: Seed > for Dummy"),
"Should generate impl GetBatchWorkspace< BatchWorkspaceError, <Dummy as ComputeLanguageModelCoreQuery>::Seed> for Dummy."
);
assert!(
code.contains("self . some_workspace . clone ()"),
"Should reference the correct field for returning the workspace Arc."
);
}
#[traced_test]
fn fails_when_no_batch_workspace_field() {
info!("Starting fails_when_no_batch_workspace_field test for GetBatchWorkspace.");
let ast: DeriveInput = parse_quote! {
#[batch_error_type(MyErr)]
struct Dummy {
#[batch_client]
some_client: (),
#[model_type]
mt: (),
}
};
let result = parse_derive_input_for_lmbw(&ast);
assert!(
result.is_err(),
"Should fail parse because batch_workspace is missing."
);
if let Err(e) = result {
let msg = format!("{e}");
assert!(
msg.contains("Missing required `#[batch_workspace]`"),
"Error should mention missing #[batch_workspace]. Actual: {msg}"
);
}
}
}