77use actix_web:: { web, HttpResponse , Responder } ;
88use anyhow:: { anyhow, Result } ;
99use serde:: { Deserialize , Serialize } ;
10+ use std:: sync:: Arc ;
1011use strum_macros:: { Display , EnumString } ;
1112
1213use ten_rust:: pkg_info:: pkg_type:: PkgType ;
1314
1415use crate :: {
15- constants:: {
16- DEFAULT_APP_CPP , DEFAULT_APP_GO , DEFAULT_APP_NODEJS ,
17- DEFAULT_APP_PYTHON , DEFAULT_EXTENSION_CPP , DEFAULT_EXTENSION_GO ,
18- DEFAULT_EXTENSION_NODEJS , DEFAULT_EXTENSION_PYTHON ,
19- } ,
16+ constants:: { TAG_CPP , TAG_GO , TAG_NODEJS , TAG_PYTHON } ,
2017 designer:: response:: { ApiResponse , ErrorResponse , Status } ,
18+ registry,
2119} ;
2220
21+ use super :: DesignerState ;
22+
2323#[ derive(
2424 Deserialize , Serialize , Debug , EnumString , Display , Clone , PartialEq ,
2525) ]
@@ -28,14 +28,14 @@ pub enum TemplateLanguage {
2828 #[ serde( rename = "cpp" ) ]
2929 Cpp ,
3030
31- #[ serde( rename = "golang " ) ]
32- Golang ,
31+ #[ serde( rename = "go " ) ]
32+ Go ,
3333
3434 #[ serde( rename = "python" ) ]
3535 Python ,
3636
37- #[ serde( rename = "typescript " ) ]
38- TypeScript ,
37+ #[ serde( rename = "nodejs " ) ]
38+ Nodejs ,
3939}
4040
4141#[ derive( Deserialize , Serialize , Debug ) ]
@@ -51,50 +51,81 @@ pub struct GetTemplateResponseData {
5151
5252pub async fn get_template_endpoint (
5353 request_payload : web:: Json < GetTemplateRequestPayload > ,
54+ state : web:: Data < Arc < DesignerState > > ,
5455) -> Result < impl Responder , actix_web:: Error > {
5556 let GetTemplateRequestPayload { pkg_type, language } =
5657 request_payload. into_inner ( ) ;
5758
5859 // Clone the language for later use in error messages.
5960 let language_clone = language. clone ( ) ;
6061
61- // Generate template name based on package type and language.
62- let template_name = match ( pkg_type, language) {
63- ( PkgType :: App , TemplateLanguage :: Cpp ) => DEFAULT_APP_CPP ,
64- ( PkgType :: App , TemplateLanguage :: Golang ) => DEFAULT_APP_GO ,
65- ( PkgType :: App , TemplateLanguage :: Python ) => DEFAULT_APP_PYTHON ,
66- ( PkgType :: App , TemplateLanguage :: TypeScript ) => DEFAULT_APP_NODEJS ,
67- ( PkgType :: Extension , TemplateLanguage :: Cpp ) => DEFAULT_EXTENSION_CPP ,
68- ( PkgType :: Extension , TemplateLanguage :: Golang ) => DEFAULT_EXTENSION_GO ,
69- ( PkgType :: Extension , TemplateLanguage :: Python ) => {
70- DEFAULT_EXTENSION_PYTHON
71- }
72- ( PkgType :: Extension , TemplateLanguage :: TypeScript ) => {
73- DEFAULT_EXTENSION_NODEJS
62+ // Determine the tags based on the language.
63+ let tags = match language {
64+ TemplateLanguage :: Cpp => Some ( vec ! [ TAG_CPP . to_string( ) ] ) ,
65+ TemplateLanguage :: Go => Some ( vec ! [ TAG_GO . to_string( ) ] ) ,
66+ TemplateLanguage :: Python => Some ( vec ! [ TAG_PYTHON . to_string( ) ] ) ,
67+ TemplateLanguage :: Nodejs => Some ( vec ! [ TAG_NODEJS . to_string( ) ] ) ,
68+ } ;
69+
70+ // Create configuration and output for calling get_package_list.
71+
72+ // Call get_package_list with the specified parameters.
73+ let result = registry:: get_package_list (
74+ state. tman_config . clone ( ) ,
75+ Some ( pkg_type) ,
76+ None , // name: None
77+ None , // version_req: None
78+ tags, // tags based on language
79+ None , // page_size: None
80+ None , // page: None
81+ & state. out . clone ( ) , // output
82+ )
83+ . await ;
84+
85+ match result {
86+ Ok ( packages) => {
87+ // Extract the package names from the PkgRegistryInfo structs.
88+ let template_names: Vec < String > = packages
89+ . iter ( )
90+ . map ( |pkg| pkg. basic_info . type_and_name . name . clone ( ) )
91+ . collect ( ) ;
92+
93+ // Handle case where no packages were found.
94+ if template_names. is_empty ( ) {
95+ let error_message = format ! (
96+ "Unsupported template combination: pkg_type={}, \
97+ language={}",
98+ pkg_type, language_clone
99+ ) ;
100+
101+ let error = anyhow ! ( error_message) ;
102+ let error_response = ErrorResponse :: from_error (
103+ & error,
104+ "Unsupported template combination" ,
105+ ) ;
106+
107+ return Ok ( HttpResponse :: BadRequest ( ) . json ( error_response) ) ;
108+ }
109+
110+ let response = ApiResponse {
111+ status : Status :: Ok ,
112+ data : GetTemplateResponseData { template_name : template_names } ,
113+ meta : None ,
114+ } ;
115+
116+ Ok ( HttpResponse :: Ok ( ) . json ( response) )
74117 }
75- _ => {
118+ Err ( err ) => {
76119 let error_message = format ! (
77- "Unsupported template combination : pkg_type={}, language={}" ,
78- pkg_type, language_clone
120+ "Failed to fetch templates : pkg_type={}, language={}, error ={}" ,
121+ pkg_type, language_clone, err
79122 ) ;
80123
81124 let error = anyhow ! ( error_message) ;
82- let error_response = ErrorResponse :: from_error (
83- & error,
84- "Unsupported template combination" ,
85- ) ;
125+ let error_response =
126+ ErrorResponse :: from_error ( & error, "Failed to fetch templates" ) ;
86127
87- return Ok ( HttpResponse :: BadRequest ( ) . json ( error_response) ) ;
128+ Ok ( HttpResponse :: InternalServerError ( ) . json ( error_response) )
88129 }
89- } ;
90-
91- let response = ApiResponse {
92- status : Status :: Ok ,
93- data : GetTemplateResponseData {
94- template_name : vec ! [ template_name. to_string( ) ] ,
95- } ,
96- meta : None ,
97- } ;
98-
99- Ok ( HttpResponse :: Ok ( ) . json ( response) )
130+ }
100131}
0 commit comments