Added function Input.getEnum(string, enum_type) #1

Merged
max merged 1 commits from check-enum-type into master 2022-01-03 20:18:36 +01:00
2 changed files with 50 additions and 0 deletions

View File

@ -643,4 +643,30 @@ function inputSettings(settingsDirectory::String)
return settings
end # function inputSettings
"""
getEnum(string, enum_type)
Converts a string to an enumerated type.
But only if the string matches an enumerated value.
# Example
```jldoctest
julia> @enum trainTypes passenger freight
julia> myTrain = "passenger"
"passenger"
julia> myTrainType = getEnum(myTrain, trainTypes)
passenger::trainTypes = 0
```
"""
function getEnum(string::String, enum_type::DataType)
inst = instances(enum_type) # get all instances of enumerated type
syms = Symbol.(inst) # convert all instances to Symbols
lookup = Dict(zip(syms, inst)) # combine instances and Symbols in a lookup table
#
n_str = Symbol(string) # normalize String via a Symbol
return lookup[n_str] # return matched enumerated type
end # function getEnum
end # module Input

24
test/testEnums.jl Normal file
View File

@ -0,0 +1,24 @@
#!/usr/bin/env julia
# -*- coding: UTF-8 -*-
# __julia-version__ = 1.7.0
# __author__ = "Martin Scheidt"
# __copyright__ = "2021"
# __license__ = "ISC"
include("../src/types.jl")
include("../src/Input.jl")
using .Input
using YAML, Test
@enum trainTypes passenger=1 freight=2 motorCoachTrain=3
@test Input.getEnum("passenger", trainTypes) == passenger::trainTypes
@test Input.getEnum("freight", trainTypes) == freight::trainTypes
@test Input.getEnum("motorCoachTrain", trainTypes) == motorCoachTrain::trainTypes
data = YAML.load(open("data/trains/train_passenger_IC2.yaml"))
@test Input.getEnum(data["train"]["trainType"], trainTypes) == passenger::trainTypes
data = YAML.load(open("data/trains/train_freight_V90withOreConsist.yaml"))
@test Input.getEnum(data["train"]["trainType"], trainTypes) == freight::trainTypes