Skip to content

Commit e30d452

Browse files
committed
Update client_gen
1 parent be8adf9 commit e30d452

File tree

1 file changed

+69
-80
lines changed

1 file changed

+69
-80
lines changed

src/rust/client_gen.rs

Lines changed: 69 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -557,104 +557,93 @@ fn method_errors(
557557
Ok(MethodErrors { codes: codes? })
558558
}
559559

560-
fn trait_method(
560+
fn trait_methods_specific_to_content_type(
561561
op: &PathOperation,
562562
prefix_length: usize,
563563
ref_cache: &mut RefCache,
564564
) -> Result<Vec<Method>> {
565565
let (result_code, result_type) = method_result(&op.op.responses.responses, ref_cache)?;
566566

567-
let name = if let Some(op_id) = &op.op.operation_id {
568-
op_id.to_case(Case::Snake)
569-
} else {
570-
op.path.strip_prefix(prefix_length).method_name(&op.method)
571-
};
567+
let name = op
568+
.op
569+
.operation_id
570+
.as_ref()
571+
.map(|op_id| op_id.to_case(Case::Snake))
572+
.unwrap_or_else(|| op.path.strip_prefix(prefix_length).method_name(&op.method));
572573

573574
let mut main_params = parameters(op, ref_cache)?;
574575

575576
if let Some(body) = &op.op.request_body {
576577
let content_specific = request_body_params(body, ref_cache)?;
577578

578579
if let Some(request_body_params) = content_specific.get_default_request_body_param() {
579-
for i in request_body_params {
580-
main_params.push(i.clone())
581-
}
582-
583-
Ok(vec![Method {
580+
main_params.extend(request_body_params.iter().cloned());
581+
return Ok(vec![create_method(
584582
name,
585-
path: op.path.clone(),
586-
original_path: op.original_path.clone(),
587-
http_method: op.method.to_string(),
588-
params: main_params,
589-
result: result_type,
590-
result_status_code: result_code.clone(),
591-
errors: method_errors(&op.op.responses.responses, result_code, ref_cache)?,
592-
}])
593-
} else {
594-
let mut methods = vec![];
595-
596-
for (content_type, params) in content_specific.params {
597-
if content_type.is_json() {
598-
let mut new_params = main_params.clone();
583+
op,
584+
&main_params,
585+
result_type,
586+
result_code,
587+
ref_cache,
588+
)?]);
589+
}
599590

600-
for i in params {
601-
new_params.push(i)
602-
}
591+
let mut methods = Vec::new();
592+
for (content_type, params) in content_specific.params {
593+
let method_name = match_content_type(content_type, &name)?;
594+
let new_params = [main_params.clone(), params].concat();
595+
methods.push(create_method(
596+
method_name,
597+
op,
598+
&new_params,
599+
result_type.clone(),
600+
result_code.clone(),
601+
ref_cache,
602+
)?);
603+
}
603604

604-
let method_name = format!("{}_json", name);
605-
methods.push(Method {
606-
name: method_name,
607-
path: op.path.clone(),
608-
original_path: op.original_path.clone(),
609-
http_method: op.method.to_string(),
610-
params: new_params.clone(),
611-
result: result_type.clone(),
612-
result_status_code: result_code.clone(),
613-
errors: method_errors(
614-
&op.op.responses.responses,
615-
result_code.clone(),
616-
ref_cache,
617-
)?,
618-
});
619-
} else if content_type.is_yaml() {
620-
let mut new_params = main_params.clone();
621-
622-
for i in params {
623-
new_params.push(i)
624-
}
605+
Ok(methods)
606+
} else {
607+
Ok(vec![create_method(
608+
name,
609+
op,
610+
&main_params,
611+
result_type,
612+
result_code,
613+
ref_cache,
614+
)?])
615+
}
616+
}
625617

626-
let method_name = format!("{}_yaml", name);
627-
628-
methods.push(Method {
629-
name: method_name,
630-
path: op.path.clone(),
631-
original_path: op.original_path.clone(),
632-
http_method: op.method.to_string(),
633-
params: new_params.clone(),
634-
result: result_type.clone(),
635-
result_status_code: result_code.clone(),
636-
errors: method_errors(
637-
&op.op.responses.responses,
638-
result_code.clone(),
639-
ref_cache,
640-
)?,
641-
});
642-
}
643-
}
618+
fn create_method(
619+
name: String,
620+
op: &PathOperation,
621+
params: &[Param],
622+
result_type: DataType,
623+
result_code: StatusCode,
624+
ref_cache: &mut RefCache,
625+
) -> Result<Method> {
626+
Ok(Method {
627+
name,
628+
path: op.path.clone(),
629+
original_path: op.original_path.clone(),
630+
http_method: op.method.to_string(),
631+
params: params.to_vec(),
632+
result: result_type,
633+
result_status_code: result_code.clone(),
634+
errors: method_errors(&op.op.responses.responses, result_code, ref_cache)?,
635+
})
636+
}
644637

645-
Ok(methods)
646-
}
638+
fn match_content_type(content_type: ContentType, base_name: &str) -> Result<String> {
639+
if content_type.is_json() {
640+
Ok(format!("{}_json", base_name))
641+
} else if content_type.is_yaml() {
642+
Ok(format!("{}_yaml", base_name))
647643
} else {
648-
Ok(vec![Method {
649-
name,
650-
path: op.path.clone(),
651-
original_path: op.original_path.clone(),
652-
http_method: op.method.to_string(),
653-
params: main_params,
654-
result: result_type,
655-
result_status_code: result_code.clone(),
656-
errors: method_errors(&op.op.responses.responses, result_code, ref_cache)?,
657-
}])
644+
Err(Error::unimplemented(
645+
"Multiple content types supported only for JSON and YAML",
646+
))
658647
}
659648
}
660649

@@ -665,7 +654,7 @@ fn trait_methods(
665654
) -> Result<Vec<Method>> {
666655
let res = operations
667656
.iter()
668-
.map(|op| trait_method(op, prefix_length, ref_cache))
657+
.map(|op| trait_methods_specific_to_content_type(op, prefix_length, ref_cache))
669658
.collect::<Result<Vec<Vec<_>>>>()?;
670659

671660
Ok(res.into_iter().flatten().collect())

0 commit comments

Comments
 (0)