Skip to content

Commit 4ef448a

Browse files
committed
tools: add ToolFromMethod support and fix type reference handling
- Fix type reference computation in collect.go to properly handle package-scoped types - Add ReserveStock and SyncWarehouse service methods as examples - Add ToolFromMethod support for automatic tool generation from service methods - Generate codecs and schemas for new tool methods - Use custom package paths for sync payload/result types
1 parent b91a3c7 commit 4ef448a

10 files changed

Lines changed: 406 additions & 10 deletions

File tree

tools/collect.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ func (g *generator) ensureDerivedType(tool *toolsexpr.ToolExpr, att *expr.Attrib
238238
typeName = svcData.Scope.GoTypeName(att)
239239
}
240240
pkgName := packageName(loc, svcData)
241-
if typeRef == "" {
242-
typeRef = svcData.Scope.GoFullTypeRef(att, pkgName)
241+
if scopedRef := svcData.Scope.GoFullTypeRef(att, pkgName); scopedRef != "" {
242+
typeRef = scopedRef
243243
}
244244
if typeRef == "" {
245245
return nil, fmt.Errorf("tools: unable to compute type reference for tool %q %s", tool.Name, usage)

tools/examples/simple/design/design.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,46 @@ var _ = API("tool_example", func() {
1313
var _ = Service("inventory", func() {
1414
Description("Inventory service exposing tools for asset lookups")
1515

16+
Method("ReserveStock", func() {
17+
Description("Reserve inventory units for a pending order")
18+
Payload(func() {
19+
Description("Order reservation parameters")
20+
Attribute("sku", String, "Inventory SKU to reserve", func() {
21+
MinLength(1)
22+
})
23+
Attribute("quantity", Int, "Number of units to reserve", func() {
24+
Minimum(1)
25+
})
26+
Required("sku", "quantity")
27+
})
28+
Result(func() {
29+
Description("Reservation outcome details")
30+
Attribute("reserved", Boolean, "True when the reservation succeeded")
31+
Attribute("reservation_id", String, "Identifier assigned to the reservation")
32+
Required("reserved")
33+
})
34+
})
35+
36+
Method("SyncWarehouse", func() {
37+
Description("Synchronize stock levels with an external warehouse system")
38+
Payload(func() {
39+
Description("Warehouse synchronization payload")
40+
Attribute("warehouse_id", String, "External warehouse identifier", func() {
41+
MinLength(1)
42+
})
43+
Attribute("items", MapOf(String, Int), "Per-item stock counts to reconcile")
44+
Required("warehouse_id", "items")
45+
Meta("struct:pkg:path", "inventory/syncpayload")
46+
})
47+
Result(func() {
48+
Description("Synchronization response summary")
49+
Attribute("accepted", Boolean, "True when the update is accepted")
50+
Attribute("errors", ArrayOf(String), "Optional per-item validation errors")
51+
Required("accepted")
52+
Meta("struct:pkg:path", "inventory/syncresult")
53+
})
54+
})
55+
1656
ToolSet("inventory_tools", func() {
1757
Tool("lookup_item", func() {
1858
Description("Retrieve an item from inventory")
@@ -48,4 +88,9 @@ var _ = Service("inventory", func() {
4888
})
4989
})
5090
})
91+
92+
ToolSet("inventory_method_tools", func() {
93+
ToolFromMethod("ReserveStock")
94+
ToolFromMethod("SyncWarehouse")
95+
})
5196
})

tools/examples/simple/gen/inventory/client.go

Lines changed: 31 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/examples/simple/gen/inventory/endpoints.go

Lines changed: 29 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/examples/simple/gen/inventory/service.go

Lines changed: 28 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/examples/simple/gen/inventory/syncpayload/sync_warehouse_payload.go

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/examples/simple/gen/inventory/syncresult/sync_warehouse_result.go

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)