Files
dingtalk-workspace-cli/internal/cli/schema_parameters_runtime.go

308 lines
14 KiB
Go

// Copyright 2026 Alibaba Group
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
package cli
import (
"strings"
)
const (
runtimeSchemaFlagMetadataRequiredAnnotation = "dws.schema.metadata.required"
runtimeSchemaFlagMetadataRequiredWhenAnnotation = "dws.schema.metadata.required_when"
runtimeSchemaFlagMetadataFormatAnnotation = "dws.schema.metadata.format"
runtimeSchemaFlagMetadataEnumAnnotation = "dws.schema.metadata.enum"
runtimeSchemaFlagMetadataExampleAnnotation = "dws.schema.metadata.example"
)
// RuntimeSchemaParameterMetadata contains reviewed CLI parameter semantics
// that Cobra cannot represent by itself. It is an independent generation
// input: generated Catalog data is never read back into this registry.
type RuntimeSchemaParameterMetadata struct {
Inherited []string
Required []string
RequiredWhen map[string]string
Formats map[string]string
Enums map[string][]string
Examples map[string]string
}
var runtimeSchemaParameterMetadataByCanonical = map[string]RuntimeSchemaParameterMetadata{}
// RegisterRuntimeSchemaParameterMetadata records strong, code-owned parameter
// semantics for one canonical command path.
func RegisterRuntimeSchemaParameterMetadata(canonicalPath string, metadata RuntimeSchemaParameterMetadata) {
canonicalPath = strings.TrimSpace(canonicalPath)
if canonicalPath == "" {
return
}
if _, exists := runtimeSchemaParameterMetadataByCanonical[canonicalPath]; exists {
panic("duplicate runtime schema parameter metadata: " + canonicalPath)
}
runtimeSchemaParameterMetadataByCanonical[canonicalPath] = metadata
}
// RuntimeSchemaParameterMetadataDefinitions returns a defensive copy for
// build-time contract validation.
func RuntimeSchemaParameterMetadataDefinitions() map[string]RuntimeSchemaParameterMetadata {
out := make(map[string]RuntimeSchemaParameterMetadata, len(runtimeSchemaParameterMetadataByCanonical))
for canonicalPath, metadata := range runtimeSchemaParameterMetadataByCanonical {
copyMetadata := RuntimeSchemaParameterMetadata{
Inherited: append([]string(nil), metadata.Inherited...),
Required: append([]string(nil), metadata.Required...),
RequiredWhen: cloneRuntimeSchemaStringMap(metadata.RequiredWhen),
Formats: cloneRuntimeSchemaStringMap(metadata.Formats),
Examples: cloneRuntimeSchemaStringMap(metadata.Examples),
Enums: make(map[string][]string, len(metadata.Enums)),
}
for flagName, values := range metadata.Enums {
copyMetadata.Enums[flagName] = append([]string(nil), values...)
}
out[canonicalPath] = copyMetadata
}
return out
}
func cloneRuntimeSchemaStringMap(source map[string]string) map[string]string {
if source == nil {
return nil
}
out := make(map[string]string, len(source))
for key, value := range source {
out[key] = value
}
return out
}
func init() {
RegisterRuntimeSchemaParameterMetadata("aisearch.enterprise_person_search", RuntimeSchemaParameterMetadata{
Required: []string{"query"},
})
RegisterRuntimeSchemaParameterMetadata("aitable.export_data", RuntimeSchemaParameterMetadata{
RequiredWhen: map[string]string{
"table-id": "scope is table or view",
"view-id": "scope is view",
},
Enums: map[string][]string{
"scope": {"all", "table", "view"},
"export-format": {"excel", "attachment", "excel_and_attachment", "excel_with_inline_images"},
},
})
RegisterRuntimeSchemaParameterMetadata("aitable.record_get", RuntimeSchemaParameterMetadata{
Required: []string{"record-ids"},
})
RegisterRuntimeSchemaParameterMetadata("aitable.view_update_filter", RuntimeSchemaParameterMetadata{
Required: []string{"json"},
Formats: map[string]string{"json": "json"},
Examples: map[string]string{"json": `[{"operator":"and","operands":[{"operator":"eq","operands":["fldX","value"]}]}]`},
})
RegisterRuntimeSchemaParameterMetadata("aitable.view_update_group", RuntimeSchemaParameterMetadata{
Required: []string{"json"},
Formats: map[string]string{"json": "json"},
Examples: map[string]string{"json": `[{"fieldId":"fldX","direction":"asc"}]`},
})
RegisterRuntimeSchemaParameterMetadata("aitable.view_update_sort", RuntimeSchemaParameterMetadata{
Required: []string{"json"},
Formats: map[string]string{"json": "json"},
Examples: map[string]string{"json": `[{"fieldId":"fldX","direction":"asc"}]`},
})
RegisterRuntimeSchemaParameterMetadata("attendance.batch_get_employee_shifts", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"start": "date", "end": "date"},
})
RegisterRuntimeSchemaParameterMetadata("attendance.approve_list", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"start": "date", "end": "date"},
Examples: map[string]string{"types": "overtime,leave"},
})
RegisterRuntimeSchemaParameterMetadata("attendance.selfsetting_get", RuntimeSchemaParameterMetadata{
Enums: map[string][]string{
"setting-scene": {
"checkRemind", "fastCheck", "checkResultNotify", "lackRemind",
"personalAttendStatNotify", "bossAttendStatNotify",
},
},
})
RegisterRuntimeSchemaParameterMetadata("calendar.add_attachments", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"files": "file-id-name-list"},
Examples: map[string]string{"files": "file-smoke:report.pdf"},
})
RegisterRuntimeSchemaParameterMetadata("calendar.add_calendar_participant", RuntimeSchemaParameterMetadata{
Inherited: []string{"event", "calendar-id"},
})
RegisterRuntimeSchemaParameterMetadata("calendar.get_calendar_participants", RuntimeSchemaParameterMetadata{
Inherited: []string{"event", "calendar-id"},
})
RegisterRuntimeSchemaParameterMetadata("calendar.remove_calendar_participant", RuntimeSchemaParameterMetadata{
Inherited: []string{"event", "calendar-id"},
})
RegisterRuntimeSchemaParameterMetadata("calendar.respond", RuntimeSchemaParameterMetadata{
Enums: map[string][]string{"status": {"needsAction", "accepted", "declined", "tentative"}},
})
RegisterRuntimeSchemaParameterMetadata("chat.download_media", RuntimeSchemaParameterMetadata{
Enums: map[string][]string{"type": {"mediaId"}},
})
RegisterRuntimeSchemaParameterMetadata("chat.list_owned_or_admin_groups", RuntimeSchemaParameterMetadata{
Enums: map[string][]string{"role": {"OWNER", "ADMIN"}},
})
RegisterRuntimeSchemaParameterMetadata("chat.send_personal_message", RuntimeSchemaParameterMetadata{
RequiredWhen: map[string]string{
"media-id": "msg-type is image",
"file": "msg-type is file or audio or video",
},
Examples: map[string]string{"media-id": "@lADP_schema_smoke"},
})
RegisterRuntimeSchemaParameterMetadata("chat.set_group_member_mute_list", RuntimeSchemaParameterMetadata{
RequiredWhen: map[string]string{"mute-time": "off is false"},
Enums: map[string][]string{
"mute-time": {"300000", "3600000", "86400000", "604800000", "2592000000"},
},
})
RegisterRuntimeSchemaParameterMetadata("chat.update_group_icon", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"icon-media-id": "dingtalk-media-id"},
Examples: map[string]string{"icon-media-id": "@lADP_schema_smoke"},
})
RegisterRuntimeSchemaParameterMetadata("chat.update_show_history_msg_option", RuntimeSchemaParameterMetadata{
Enums: map[string][]string{"option": {"FORBIDDEN", "RECENT_100", "ALL"}},
})
RegisterRuntimeSchemaParameterMetadata("contact.get_dept_info_by_dept_id", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"dept": "numeric-id"},
})
RegisterRuntimeSchemaParameterMetadata("contact.get_sub_depts_by_dept_id", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"dept": "numeric-id"},
})
RegisterRuntimeSchemaParameterMetadata("dev.apply_dev_app_permissions", RuntimeSchemaParameterMetadata{
Required: []string{"scope-values"},
})
RegisterRuntimeSchemaParameterMetadata("dev.remove_dev_app_permissions", RuntimeSchemaParameterMetadata{
Required: []string{"scope-values"},
})
RegisterRuntimeSchemaParameterMetadata("dev.subscribe_dev_app_events", RuntimeSchemaParameterMetadata{
Required: []string{"event-codes"},
})
RegisterRuntimeSchemaParameterMetadata("dev.unsubscribe_dev_app_events", RuntimeSchemaParameterMetadata{
Required: []string{"event-codes"},
})
RegisterRuntimeSchemaParameterMetadata("minutes.add_member_permission", RuntimeSchemaParameterMetadata{
Enums: map[string][]string{"policy": {"0", "1", "2", "3", "4"}},
})
RegisterRuntimeSchemaParameterMetadata("pat.browser_policy", RuntimeSchemaParameterMetadata{
Required: []string{"enabled"},
Enums: map[string][]string{"enabled": {"true", "false"}},
})
RegisterRuntimeSchemaParameterMetadata("report.create_report", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"contents": "json"},
Examples: map[string]string{
"contents": `[{"content":"schema smoke","sort":"0","key":"work","contentType":"markdown","type":"1"}]`,
},
})
RegisterRuntimeSchemaParameterMetadata("sheet.batch_update", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"operations": "json"},
Examples: map[string]string{
"operations": `[{"toolName":"range clear","input":{"sheet-id":"Sheet1","range":"A1:B2","type":"content"}}]`,
},
})
chartPropertiesExample := `{"position":{"row":0,"col":"A"},"dimensions":{"width":600,"height":400},"chart":{"type":"column","series":[{"value":["B2:B10"]}],"category":["A2:A10"]}}`
for _, canonicalPath := range []string{"sheet.chart_create", "sheet.chart_update"} {
RegisterRuntimeSchemaParameterMetadata(canonicalPath, RuntimeSchemaParameterMetadata{
Formats: map[string]string{"properties": "json"},
Examples: map[string]string{"properties": chartPropertiesExample},
})
}
RegisterRuntimeSchemaParameterMetadata("sheet.create_pivot_table", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"properties": "json"},
Examples: map[string]string{
"properties": `{"values":[{"field":"Amount","summarize_by":"sum"}]}`,
},
})
RegisterRuntimeSchemaParameterMetadata("sheet.update_pivot_table", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"properties": "json"},
Examples: map[string]string{"properties": `{"show_subtotals":false}`},
})
RegisterRuntimeSchemaParameterMetadata("sheet.range_batch_clear", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"ranges": "json"},
Examples: map[string]string{"ranges": `["Sheet1!A1:B2"]`},
})
RegisterRuntimeSchemaParameterMetadata("todo.add_todo_reminder", RuntimeSchemaParameterMetadata{
RequiredWhen: map[string]string{
"due-date-offset": "base-time is dueTime",
"reminder-time-stamp": "base-time is customTime",
},
Enums: map[string][]string{"base-time": {"dueTime", "customTime"}},
Examples: map[string]string{
"due-date-offset": "-30",
"reminder-time-stamp": "2026-03-10T18:00:00+08:00",
},
})
RegisterRuntimeSchemaParameterMetadata("todo.get_user_todos_in_current_org", RuntimeSchemaParameterMetadata{
Examples: map[string]string{"role-types": "creator,executor"},
})
for _, canonicalPath := range []string{
"sheet.add_dimension",
"sheet.delete_dimension",
"sheet.insert_dimension",
"sheet.move_dimension",
"sheet.update_dimension",
} {
metadata := RuntimeSchemaParameterMetadata{
Enums: map[string][]string{"dimension": {"ROWS", "COLUMNS"}},
}
switch canonicalPath {
case "sheet.delete_dimension", "sheet.insert_dimension":
metadata.Formats = map[string]string{"length": "positive-integer"}
metadata.Examples = map[string]string{"position": "1"}
case "sheet.update_dimension":
metadata.Formats = map[string]string{"length": "positive-integer"}
metadata.Examples = map[string]string{"start-index": "1"}
}
RegisterRuntimeSchemaParameterMetadata(canonicalPath, metadata)
}
RegisterRuntimeSchemaParameterMetadata("sheet.create_cond_format", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"ranges": "json", "condition": "json", "cell-style": "json", "data-bar-style": "json"},
Examples: map[string]string{
"ranges": `["A1:B2"]`,
"condition": `{"numberCondition":{"operator":"greater","value1":"80"}}`,
"cell-style": `{"backgroundColor":"#FFCDD2","bold":true}`,
},
})
RegisterRuntimeSchemaParameterMetadata("sheet.update_cond_format", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"ranges": "json", "condition": "json", "cell-style": "json", "data-bar-style": "json"},
Examples: map[string]string{
"ranges": `["A1:B2"]`,
"condition": `{"numberCondition":{"operator":"greater","value1":"80"}}`,
"cell-style": `{"backgroundColor":"#FFCDD2","bold":true}`,
},
})
RegisterRuntimeSchemaParameterMetadata("sheet.range_set_style", RuntimeSchemaParameterMetadata{
Formats: map[string]string{
"bg-colors-json": "json",
"font-colors-json": "json",
"font-sizes-json": "json",
"font-weights-json": "json",
"h-aligns-json": "json",
"v-aligns-json": "json",
},
Enums: map[string][]string{
"font-weight": {"bold", "normal"},
"h-align": {"left", "center", "right", "general"},
"v-align": {"top", "middle", "bottom"},
"word-wrap": {"overflow", "clip", "autoWrap"},
},
Examples: map[string]string{
"bg-colors-json": `[["#ffffff","#ffffff"],["#ffffff","#ffffff"]]`,
"font-colors-json": `[["#000000","#000000"],["#000000","#000000"]]`,
"font-sizes-json": `[[12,12],[12,12]]`,
"font-weights-json": `[["normal","normal"],["normal","normal"]]`,
"h-aligns-json": `[["left","left"],["left","left"]]`,
"v-aligns-json": `[["top","top"],["top","top"]]`,
},
})
RegisterRuntimeSchemaParameterMetadata("sheet.set_dropdown_lists", RuntimeSchemaParameterMetadata{
Formats: map[string]string{"options": "json"},
Examples: map[string]string{"options": `[{"value":"option1"},{"value":"option2"}]`},
})
RegisterRuntimeSchemaParameterMetadata("wiki.search_wikiSpaces", RuntimeSchemaParameterMetadata{
Enums: map[string][]string{"type": {"myWikiSpace"}},
})
}