Skip to main content

socketry_project/
lib.rs

1// Released under the MIT License.
2// Copyright, 2026, by Samuel Williams.
3
4//! Shared Socketry Rust project conventions and development tasks.
5//!
6//! Add this crate to a private `bake/` package to link the standard project
7//! tasks and their published agent context into a repository.
8use bake::{Context, Result};
9use bake_agent_context as _;
10use bake_cargo as _;
11use bake_license as _;
12use bake_readme as _;
13use bake_releases as _;
14use bake_test_rust as _;
15
16/// Refresh the standard project files after a Cargo version bump.
17#[bake::task(name = "cargo:after_version_bump")]
18pub fn after_version_bump(context: &mut Context, version: String) -> Result<()> {
19    context.call("license:update", &[])?;
20    context.call("releases:update", &[&format!("v{version}")])?;
21    context.call("readme:update", &[])?;
22    Ok(())
23}
24
25#[cfg(test)]
26mod tests {
27    use bake::{Arguments, Parameter, Registry, Result, Task, Value};
28
29    #[derive(Default)]
30    struct Calls(Vec<(String, Option<String>)>);
31
32    fn record(context: &mut bake::Context, name: &str, value: Option<String>) -> Result<Value> {
33        context
34            .get_mut::<Calls>()
35            .expect("the test records calls")
36            .0
37            .push((name.to_owned(), value));
38        Ok(Value::Null)
39    }
40
41    fn update_license(context: &mut bake::Context, _: &Arguments) -> Result<Value> {
42        record(context, "license:update", None)
43    }
44
45    fn update_releases(context: &mut bake::Context, arguments: &Arguments) -> Result<Value> {
46        record(
47            context,
48            "releases:update",
49            Some(arguments.required::<String>("version")?),
50        )
51    }
52
53    fn update_readme(context: &mut bake::Context, _: &Arguments) -> Result<Value> {
54        record(context, "readme:update", None)
55    }
56
57    #[test]
58    fn refreshes_project_files_in_order_for_the_requested_version() {
59        let mut registry = Registry::discover().unwrap();
60        registry
61            .replace(
62                "license:update",
63                Task::new("license:update", "", vec![], update_license),
64            )
65            .unwrap();
66        registry
67            .replace(
68                "releases:update",
69                Task::new(
70                    "releases:update",
71                    "",
72                    vec![Parameter::new::<String>("version")],
73                    update_releases,
74                ),
75            )
76            .unwrap();
77        registry
78            .replace(
79                "readme:update",
80                Task::new("readme:update", "", vec![], update_readme),
81            )
82            .unwrap();
83
84        let mut context = registry.context(".");
85        context.insert(Calls::default());
86
87        super::after_version_bump(&mut context, "0.3.0".to_owned()).unwrap();
88
89        assert_eq!(
90            context.get::<Calls>().unwrap().0,
91            [
92                ("license:update".to_owned(), None),
93                ("releases:update".to_owned(), Some("v0.3.0".to_owned())),
94                ("readme:update".to_owned(), None),
95            ]
96        );
97    }
98
99    #[test]
100    fn registers_the_project_version_bump_hook() {
101        let registry = Registry::discover().unwrap();
102        assert!(
103            registry
104                .tasks()
105                .any(|task| task.name() == "cargo:after_version_bump")
106        );
107    }
108}