Skip to content

Commit 4cf7c40

Browse files
0xebtilakpatell
andcommitted
feat: add fluent setters for Tool skip_permission and overrides_built_in_tool
Add ref-qualified with_skip_permission() and with_overrides_built_in_tool() fluent setters enabling chaining on make_tool() and ToolBuilder results. Closes #11 Co-authored-by: Tilak Patel <tilakny@gmail.com>
1 parent 083664f commit 4cf7c40

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

include/copilot/types.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,14 @@ struct Tool
12911291
/// When true, the tool can execute without a permission prompt.
12921292
/// (Upstream v0.1.49+)
12931293
bool skip_permission = false;
1294+
1295+
/// Fluent setter — mark this tool as not requiring permission prompts.
1296+
Tool& with_skip_permission(bool value = true) & { skip_permission = value; return *this; }
1297+
Tool with_skip_permission(bool value = true) && { skip_permission = value; return std::move(*this); }
1298+
1299+
/// Fluent setter — mark this tool as replacing a built-in CLI tool.
1300+
Tool& with_overrides_built_in_tool(bool value = true) & { overrides_built_in_tool = value; return *this; }
1301+
Tool with_overrides_built_in_tool(bool value = true) && { overrides_built_in_tool = value; return std::move(*this); }
12941302
};
12951303

12961304
// =============================================================================

tests/test_tool_builder.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,3 +440,62 @@ TEST(MakeToolTest, IntAndBoolParams)
440440
auto result = tool.handler(inv);
441441
EXPECT_EQ(result.text_result_for_llm, "port=8080,enabled=true");
442442
}
443+
444+
// =============================================================================
445+
// Fluent Setter Tests (PR #11 contribution by @tilakpatell)
446+
// =============================================================================
447+
448+
TEST(ToolFluentSetterTest, SkipPermissionOnLvalue)
449+
{
450+
Tool tool;
451+
tool.name = "safe_read";
452+
tool.description = "Read-only lookup";
453+
EXPECT_FALSE(tool.skip_permission);
454+
455+
tool.with_skip_permission();
456+
EXPECT_TRUE(tool.skip_permission);
457+
458+
tool.with_skip_permission(false);
459+
EXPECT_FALSE(tool.skip_permission);
460+
}
461+
462+
TEST(ToolFluentSetterTest, OverridesBuiltInOnLvalue)
463+
{
464+
Tool tool;
465+
tool.name = "edit_file";
466+
tool.description = "Custom editor";
467+
EXPECT_FALSE(tool.overrides_built_in_tool);
468+
469+
tool.with_overrides_built_in_tool();
470+
EXPECT_TRUE(tool.overrides_built_in_tool);
471+
472+
tool.with_overrides_built_in_tool(false);
473+
EXPECT_FALSE(tool.overrides_built_in_tool);
474+
}
475+
476+
TEST(ToolFluentSetterTest, ChainingOnMakeToolResult)
477+
{
478+
auto tool = copilot::make_tool(
479+
"safe_lookup", "Read-only lookup",
480+
[](std::string query) { return "result: " + query; },
481+
{"query"})
482+
.with_skip_permission()
483+
.with_overrides_built_in_tool();
484+
485+
EXPECT_EQ(tool.name, "safe_lookup");
486+
EXPECT_TRUE(tool.skip_permission);
487+
EXPECT_TRUE(tool.overrides_built_in_tool);
488+
}
489+
490+
TEST(ToolFluentSetterTest, ChainingOnToolBuilder)
491+
{
492+
auto tool = ToolBuilder("my_tool", "A tool")
493+
.param<std::string>("input", "Input text")
494+
.handler([](const std::string& s) { return s; })
495+
.with_skip_permission()
496+
.with_overrides_built_in_tool();
497+
498+
EXPECT_TRUE(tool.skip_permission);
499+
EXPECT_TRUE(tool.overrides_built_in_tool);
500+
EXPECT_EQ(tool.name, "my_tool");
501+
}

0 commit comments

Comments
 (0)