Roger-luo / Configurations.jl

Options & Configurations made easy.
https://configurations.rogerluo.dev/stable
MIT License
80 stars 12 forks source link

ArgumentError in from_dict for Vectors and Strings #97

Open xlxs4 opened 10 months ago

xlxs4 commented 10 months ago

When trying to parse a string in the TOML and convert it to a vector, it yields:

ERROR: ArgumentError: map(f, s::AbstractString) requires f to return AbstractChar; try map(f, collect(s)) or a comprehension instead

Hitting https://github.com/Roger-luo/Configurations.jl/blob/ac5e96c88492ac8e73e9fe3ecd433320212a526e/src/from_dict.jl#L137

when trying to extend from_dict to work with a T<:AbstractVector and an S<:AbstractString.

MWE:

function axis2vec(s)
    axis2vec = Dict(
        "+X" => Vector(1.0, 0, 0),
        "-X" => Vector(-1.0, 0, 0),
        "+Y" => Vector(0, 1.0, 0),
        "-Y" => Vector(0, -1.0, 0),
        "+Z" => Vector(0, 0, 1.0),
        "-Z" => Vector(0, 0, -1.0),
    )
    return axis2vec[axis]
end

@option struct Example
    xs::Vector{Float64}
end

Configurations.from_dict(::Type{Example}, ::Type{Vector{Float64}}, x::AbstractString) = axis2vec(x)
xlxs4 commented 8 months ago

For anyone interested, I'm currently circumventing this by doing something similar to:

struct Example
    xs::Vector{Float64}
end

@option struct _Example
    xs::String
end

_from_dict(t, d) = from_dict(t, d)
function _from_dict(t::Type{_Example}, d)
    _ex = from_dict(t, d)
    return Example(axis2vec(_ex.xs)
end