Skip to content

Commit d37ddee

Browse files
committed
feat: enhance template retrieval by introducing language-based tagging and updating test cases
1 parent 152165c commit d37ddee

File tree

4 files changed

+86
-43
lines changed

4 files changed

+86
-43
lines changed

core/src/ten_manager/src/constants/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
// Refer to the "LICENSE" file in the root directory for more information.
66
//
77
pub mod registry;
8+
pub mod tag;
89

910
pub use registry::*;
11+
pub use tag::*;
1012

1113
pub const DOT_TEN_DIR: &str = ".ten";
1214
pub const APP_DIR_IN_DOT_TEN_DIR: &str = "app";
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//
2+
// Copyright © 2025 Agora
3+
// This file is part of TEN Framework, an open source project.
4+
// Licensed under the Apache License, Version 2.0, with certain conditions.
5+
// Refer to the "LICENSE" file in the root directory for more information.
6+
//
7+
pub const TAG_CPP: &str = "cpp";
8+
pub const TAG_GO: &str = "go";
9+
pub const TAG_PYTHON: &str = "python";
10+
pub const TAG_NODEJS: &str = "nodejs";

core/src/ten_manager/src/designer/template_pkgs/mod.rs

Lines changed: 72 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@
77
use actix_web::{web, HttpResponse, Responder};
88
use anyhow::{anyhow, Result};
99
use serde::{Deserialize, Serialize};
10+
use std::sync::Arc;
1011
use strum_macros::{Display, EnumString};
1112

1213
use ten_rust::pkg_info::pkg_type::PkgType;
1314

1415
use 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

5252
pub 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
}

core/src/ten_manager/tests/test_case/designer/template_pkgs/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ async fn test_get_template_app_typescript() {
4646

4747
let request_payload = GetTemplateRequestPayload {
4848
pkg_type: PkgType::App,
49-
language: TemplateLanguage::TypeScript,
49+
language: TemplateLanguage::Nodejs,
5050
};
5151

5252
let req = test::TestRequest::post()
@@ -127,7 +127,7 @@ async fn test_get_template_unsupported() {
127127
// combination.
128128
let request_payload = GetTemplateRequestPayload {
129129
pkg_type: PkgType::Invalid,
130-
language: TemplateLanguage::TypeScript,
130+
language: TemplateLanguage::Nodejs,
131131
};
132132

133133
let req = test::TestRequest::post()

0 commit comments

Comments
 (0)