mirror of
https://github.com/larksuite/cli.git
synced 2026-07-03 14:02:43 +08:00
47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// ResolveOpenIDsTyped expands the special identifier "me" to the current
|
|
// user's open_id, removes duplicates case-insensitively while preserving the
|
|
// first-occurrence form, and returns nil for an empty input. flagName names
|
|
// the flag being resolved (e.g. "--user-ids") and is recorded on the typed
|
|
// error.
|
|
func ResolveOpenIDsTyped(flagName string, ids []string, runtime *RuntimeContext) ([]string, error) {
|
|
out, msg := resolveOpenIDs(flagName, ids, runtime)
|
|
if msg != "" {
|
|
return nil, ValidationErrorf("%s", msg).WithParam(flagName)
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
func resolveOpenIDs(flagName string, ids []string, runtime *RuntimeContext) ([]string, string) {
|
|
if len(ids) == 0 {
|
|
return nil, ""
|
|
}
|
|
currentUserID := runtime.UserOpenId()
|
|
seen := make(map[string]struct{}, len(ids))
|
|
out := make([]string, 0, len(ids))
|
|
for _, id := range ids {
|
|
if strings.EqualFold(id, "me") {
|
|
if currentUserID == "" {
|
|
return nil, fmt.Sprintf("%s: \"me\" requires a logged-in user with a resolvable open_id", flagName)
|
|
}
|
|
id = currentUserID
|
|
}
|
|
key := strings.ToLower(id)
|
|
if _, ok := seen[key]; ok {
|
|
continue
|
|
}
|
|
seen[key] = struct{}{}
|
|
out = append(out, id)
|
|
}
|
|
return out, ""
|
|
}
|