diff --git a/mlf-codegen/src/lib.rs b/mlf-codegen/src/lib.rs index cf65b3d..501fa94 100644 --- a/mlf-codegen/src/lib.rs +++ b/mlf-codegen/src/lib.rs @@ -405,30 +405,33 @@ fn generate_query_json(query: &Query, usage_counts: &HashMap, wor let output_encoding = get_encoding_annotation(&query.annotations, "output") .unwrap_or_else(|| "application/json".to_string()); - let output = match &query.returns { - ReturnType::None { .. } => None, + let (output, errors) = match &query.returns { + ReturnType::None { .. } => (None, None), ReturnType::Type(ty) => { let mut output_obj = Map::new(); output_obj.insert("encoding".to_string(), json!(output_encoding)); output_obj.insert("schema".to_string(), generate_type_json(ty, usage_counts, workspace, current_namespace)); - Some(Value::Object(output_obj)) + (Some(Value::Object(output_obj)), None) } ReturnType::TypeWithErrors { success, errors, .. } => { - let mut error_defs = Map::new(); + let mut error_array = Vec::new(); for error in errors { - error_defs.insert( - error.name.name.clone(), + let error_docs = extract_docs(&error.docs); + let error_obj = if error_docs.is_empty() { + json!({ "name": error.name.name.clone() }) + } else { json!({ - "description": extract_docs(&error.docs) - }), - ); + "name": error.name.name.clone(), + "description": error_docs + }) + }; + error_array.push(error_obj); } let mut output_obj = Map::new(); output_obj.insert("encoding".to_string(), json!(output_encoding)); output_obj.insert("schema".to_string(), generate_type_json(success, usage_counts, workspace, current_namespace)); - output_obj.insert("errors".to_string(), json!(error_defs)); - Some(Value::Object(output_obj)) + (Some(Value::Object(output_obj)), Some(Value::Array(error_array))) } }; @@ -439,6 +442,9 @@ fn generate_query_json(query: &Query, usage_counts: &HashMap, wor if let Some(output_val) = output { query_obj.insert("output".to_string(), output_val); } + if let Some(errors_val) = errors { + query_obj.insert("errors".to_string(), errors_val); + } Value::Object(query_obj) } @@ -482,30 +488,33 @@ fn generate_procedure_json(procedure: &Procedure, usage_counts: &HashMap None, + let (output, errors) = match &procedure.returns { + ReturnType::None { .. } => (None, None), ReturnType::Type(ty) => { let mut output_obj = Map::new(); output_obj.insert("encoding".to_string(), json!(output_encoding)); output_obj.insert("schema".to_string(), generate_type_json(ty, usage_counts, workspace, current_namespace)); - Some(Value::Object(output_obj)) + (Some(Value::Object(output_obj)), None) } ReturnType::TypeWithErrors { success, errors, .. } => { - let mut error_defs = Map::new(); + let mut error_array = Vec::new(); for error in errors { - error_defs.insert( - error.name.name.clone(), + let error_docs = extract_docs(&error.docs); + let error_obj = if error_docs.is_empty() { + json!({ "name": error.name.name.clone() }) + } else { json!({ - "description": extract_docs(&error.docs) - }), - ); + "name": error.name.name.clone(), + "description": error_docs + }) + }; + error_array.push(error_obj); } let mut output_obj = Map::new(); output_obj.insert("encoding".to_string(), json!(output_encoding)); output_obj.insert("schema".to_string(), generate_type_json(success, usage_counts, workspace, current_namespace)); - output_obj.insert("errors".to_string(), json!(error_defs)); - Some(Value::Object(output_obj)) + (Some(Value::Object(output_obj)), Some(Value::Array(error_array))) } }; @@ -518,6 +527,9 @@ fn generate_procedure_json(procedure: &Procedure, usage_counts: &HashMap