Skip to content

Commit 4dc348b

Browse files
committed
feat(params): add secret parameter support
1 parent 9f24175 commit 4dc348b

6 files changed

Lines changed: 67 additions & 10 deletions

File tree

crates/config/src/towerfile.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ pub struct Parameter {
1212

1313
#[serde(default)]
1414
pub default: String,
15+
16+
#[serde(default)]
17+
pub secret: bool,
1518
}
1619

1720
#[derive(Deserialize, Serialize, Debug)]
@@ -122,6 +125,7 @@ impl Towerfile {
122125
name,
123126
description,
124127
default,
128+
secret: false,
125129
});
126130
}
127131
}
@@ -272,6 +276,26 @@ mod test {
272276
assert_eq!(towerfile.parameters.len(), 2);
273277
assert_eq!(towerfile.parameters[0].name, "my_first_param");
274278
assert_eq!(towerfile.parameters[1].name, "my_second_param");
279+
assert!(!towerfile.parameters[0].secret);
280+
}
281+
282+
#[test]
283+
fn test_parses_secret_parameters() {
284+
let toml = r#"
285+
[app]
286+
name = "my-app"
287+
script = "./script.py"
288+
source = ["*.py"]
289+
290+
[[parameters]]
291+
name = "MY_PARAMETER"
292+
secret = true
293+
"#;
294+
295+
let towerfile = crate::Towerfile::from_toml(toml).unwrap();
296+
assert_eq!(towerfile.parameters.len(), 1);
297+
assert_eq!(towerfile.parameters[0].name, "MY_PARAMETER");
298+
assert!(towerfile.parameters[0].secret);
275299
}
276300

277301
#[test]

crates/tower-api/src/models/parameter.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ pub struct Parameter {
2323
#[serde_as(as = "DefaultOnNull")]
2424
#[serde(rename = "name")]
2525
pub name: String,
26+
#[serde(default)]
27+
#[serde(rename = "secret")]
28+
pub secret: bool,
2629
}
2730

2831
impl Parameter {
@@ -31,6 +34,7 @@ impl Parameter {
3134
default,
3235
description,
3336
name,
37+
secret: false,
3438
}
3539
}
3640
}

crates/tower-api/src/models/run_parameter.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,17 @@ pub struct RunParameter {
2020
#[serde_as(as = "DefaultOnNull")]
2121
#[serde(rename = "value")]
2222
pub value: String,
23+
#[serde(default)]
24+
#[serde(rename = "secret")]
25+
pub secret: bool,
2326
}
2427

2528
impl RunParameter {
2629
pub fn new(name: String, value: String) -> RunParameter {
27-
RunParameter { name, value }
30+
RunParameter {
31+
name,
32+
value,
33+
secret: false,
34+
}
2835
}
2936
}

crates/tower-cmd/src/api.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,11 @@ pub async fn create_schedule(
840840
let run_parameters = parameters.map(|params| {
841841
params
842842
.into_iter()
843-
.map(|(key, value)| RunParameter { name: key, value })
843+
.map(|(key, value)| RunParameter {
844+
name: key,
845+
value,
846+
secret: false,
847+
})
844848
.collect()
845849
});
846850

@@ -874,7 +878,11 @@ pub async fn update_schedule(
874878
let run_parameters = parameters.map(|params| {
875879
params
876880
.into_iter()
877-
.map(|(key, value)| RunParameter { name: key, value })
881+
.map(|(key, value)| RunParameter {
882+
name: key,
883+
value,
884+
secret: false,
885+
})
878886
.collect()
879887
});
880888

crates/tower-cmd/src/mcp.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,22 @@ IMPORTANT REMINDERS:
889889
async fn tower_schedules_list(&self) -> Result<CallToolResult, McpError> {
890890
match api::list_schedules(&self.config, None, None).await {
891891
Ok(response) => {
892-
Self::json_success(serde_json::json!({"schedules": response.schedules}))
892+
let schedules = response
893+
.schedules
894+
.into_iter()
895+
.map(|mut schedule| {
896+
if let Some(parameters) = schedule.parameters.as_mut() {
897+
for parameter in parameters {
898+
if parameter.secret {
899+
parameter.value = "[hidden]".to_string();
900+
}
901+
}
902+
}
903+
schedule
904+
})
905+
.collect::<Vec<_>>();
906+
907+
Self::json_success(serde_json::json!({"schedules": schedules}))
893908
}
894909
Err(e) => Self::error_result("Failed to list schedules", e),
895910
}

crates/tower/src/lib.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ mod bindings {
2323

2424
let spec = PackageSpec::from_towerfile(&towerfile);
2525

26-
let runtime = tokio::runtime::Runtime::new()
27-
.map_err(|e| PyRuntimeError::new_err(e.to_string()))?;
26+
let runtime =
27+
tokio::runtime::Runtime::new().map_err(|e| PyRuntimeError::new_err(e.to_string()))?;
2828

2929
let output = PathBuf::from(output);
3030

@@ -40,8 +40,7 @@ mod bindings {
4040
.as_ref()
4141
.ok_or_else(|| PyRuntimeError::new_err("package build produced no output file"))?;
4242

43-
std::fs::copy(src, &output)
44-
.map_err(|e| PyRuntimeError::new_err(e.to_string()))?;
43+
std::fs::copy(src, &output).map_err(|e| PyRuntimeError::new_err(e.to_string()))?;
4544

4645
Ok(())
4746
})
@@ -53,8 +52,8 @@ mod bindings {
5352
/// args: Command line arguments (typically sys.argv).
5453
#[pyfunction]
5554
fn _run_cli(args: Vec<String>) -> PyResult<()> {
56-
let runtime = tokio::runtime::Runtime::new()
57-
.map_err(|e| PyRuntimeError::new_err(e.to_string()))?;
55+
let runtime =
56+
tokio::runtime::Runtime::new().map_err(|e| PyRuntimeError::new_err(e.to_string()))?;
5857

5958
// App::new_from_args() must run inside block_on because
6059
// Session::from_config_dir() requires an active tokio reactor.

0 commit comments

Comments
 (0)