xmake-io / xmake

🔥 A cross-platform build utility based on Lua
https://xmake.io
Apache License 2.0
9.87k stars 775 forks source link

convert option value? #5606

Closed Freed-Wu closed 2 weeks ago

Freed-Wu commented 2 weeks ago

Is your feature request related to a problem? Please describe.

Screenshot from 2024-09-12 04-34-04

When user select error, warning, info, debug, it will be converted to 0, 1, 2, 3.

Describe the solution you'd like

set_values{error=0, warning=1, info=2, debug=3}

Describe alternatives you've considered

No response

Additional context

No response

waruqi commented 2 weeks ago

? you can convert it in option/after_check (xmake.lua) by yourself

Freed-Wu commented 2 weeks ago

Looks a little troublesome, perhaps we can pass a hash table to set_values()?

waruqi commented 2 weeks ago

Not considered

Freed-Wu commented 2 weeks ago

How to convert in after_check()?

Freed-Wu commented 2 weeks ago

It looks cannot modify option:value() in after_check().

waruqi commented 2 weeks ago

option:set_value

Freed-Wu commented 2 weeks ago

Can we get set_values's values in after_check's option?

waruqi commented 2 weeks ago

you can set it.

Freed-Wu commented 2 weeks ago

Can we have a option:get_values() to get set_values() in a option scope?

waruqi commented 2 weeks ago

has_config is_comfig get_config in global description scope

Freed-Wu commented 2 weeks ago

Currently, I must

opt = "log level"
option(opt)
do
    set_default("info")
    local values = { "error", "warning", "info", "debug" }
    set_values(values)
    after_check(
        function(option)
            for i, value in ipairs(values) do
                if option:value() == value then
                    option:set_value(i - 1)
                end
            end
        end
    )
    set_description("log level")
end

Can we

opt = "log level"
option(opt)
do
    set_default("info")
    set_values{ "error", "warning", "info", "debug" }
    after_check(
        function(option)
            for i, value in ipairs(option:values()) do
                if option:value() == value then
                    option:set_value(i - 1)
                end
            end
        end
    )
    set_description("log level")
end
waruqi commented 2 weeks ago
option("log level")
    set_default("info")
    set_description("log level")
    set_values("error", "warning", "info", "debug")
    after_check(function(option)
        for i, value in ipairs(option:get("values")) do
            if option:value() == value then
                option:set_value(i - 1)
            end
        end
    end)
waruqi commented 2 weeks ago

or

option("log level")
    set_default("info")
    set_description("log level")
    set_values("error", "warning", "info", "debug")

function get_log_level()
    local level = get_config("log level")
    local maps = {error = 0, warning = 1, info = 2, debug = 3}
    return maps[level] or 2
end
Freed-Wu commented 2 weeks ago

Thanks!