+
Skip to content

Improving slice and map support #379

Open
@renom

Description

@renom

After rethinking of #355, I came to a conclusion that it'd be useful to have the following approach to work with slices and maps in Kong:

A slice or map of struct (e.g. []SomeStruct or map[string]SomeStruct) isn't ignored by Kong as well as it isn't ignored if the struct has a slice or map field:

type SomeStruct struct {
  List []NestedStruct
  Dict map[string]NestedStruct
}

type NestedStruct struct {
  Count int
  Text string
}

I.e. if we have:

var CLI struct {
  Command struct {
    Data1 []SomeStruct
    Data2 map[string]SomeStruct
  } `cmd:""`
}

Then we have the following flags (total 8):

Command.Data1.#.List.#.Count
Command.Data1.#.List.#.Text
Command.Data1.#.Dict.?.Count
Command.Data1.#.Dict.?.Text
Command.Data2.?.List.#.Count
Command.Data2.?.List.#.Text
Command.Data2.?.Dict.?.Count
Command.Data2.?.Dict.?.Text

Those flags should be displayed in the help.

Prefixes (prefix and envPrefix) should work the same way as for regular flags with one exception:
Symbols # and ? will be used for a slice index and map key respectively:

var CLI struct {
  Command struct {
    Data1 []SomeStruct `envprefix:"DATA1_#_"`
    Data2 map[string]SomeStruct `cmd:"" envprefix:"DATA2_?_"`
  } `cmd:"" envprefix:"COMMAND_"`
}

type SomeStruct struct {
  List []NestedStruct `envprefix:"LIST_#_"`
  Dict map[string]NestedStruct `envprefix:"DICT_?_"`
}

type NestedStruct struct {
  Count int `env:"COUNT"`
  Text string `env:"TEXT"`
}

An example of .env:

COMMAND_DATA1_0_LIST_0_COUNT=5
COMMAND_DATA1_0_LIST_0_TEXT="AAAAA"
COMMAND_DATA1_0_LIST_1_COUNT=3
COMMAND_DATA1_0_LIST_1_TEXT="AAA"
COMMAND_DATA1_0_DICT_MAPKEY_COUNT=1
COMMAND_DATA1_0_DICT_MAPKEY_TEXT="A"
COMMAND_DATA1_0_DICT_ANOTHERKEY_COUNT=4
COMMAND_DATA1_0_DICT_ANOTHERKEY_TEXT="AAAA"
COMMAND_DATA1_1_LIST_0_COUNT=7
COMMAND_DATA1_1_LIST_0_TEXT="AAAAAAA"
COMMAND_DATA1_1_DICT_MAPKEY_COUNT=1
COMMAND_DATA1_1_DICT_MAPKEY_TEXT="A"

The vars with the same slice indexes (map keys) will refer to the same slice (map) element. I.e. COMMAND_DATA1_0_LIST_0_COUNT=5 and COMMAND_DATA1_0_LIST_0_TEXT="AAAAA" will fill up the same NestedStruct.

If a slice was prefilled with a resolver, the data from .env is appended to the slice so that the prefilled data can't be overridden (the indexes are just unique identifiers). On the contrary, map elements can be overridden.

Fields of every element of a slice or map should be validated with the specified Kong rules (enum, required etc.).

WDYT?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载