diff --git a/ray_julia_jll/src/expr.jl b/ray_julia_jll/src/expr.jl index b9d8856a..a4e80064 100644 --- a/ray_julia_jll/src/expr.jl +++ b/ray_julia_jll/src/expr.jl @@ -1,32 +1,28 @@ -function _enum_getproperty_expr(base_type::Type, members) - body = Expr(:if, :(field === $(QuoteNode(members[1]))), members[1], nothing) +function _enum_symbol_constructor_expr(base_type::Type, members) + base_type_sym = nameof(base_type) + body = Expr(:if, :(member === $(QuoteNode(members[1]))), members[1], nothing) ex = body for member in members[2:end] - ex.args[3] = Expr(:elseif, :(field === $(QuoteNode(member))), member, nothing) + ex.args[3] = Expr(:elseif, :(member === $(QuoteNode(member))), member, nothing) ex = ex.args[3] end - ex.args[3] = :(Base.getfield($(nameof(base_type)), field)) + ex.args[3] = :(throw(ArgumentError("$($base_type_sym) has no member named: $member"))) + return quote - function Base.getproperty(::Type{$(nameof(base_type))}, field::Symbol) + function $base_type_sym(member::Symbol) $body end end end -function _enum_propertynames_expr(base_type::Type, members) - public_properties = Expr(:tuple, QuoteNode.(members)...) - private_properties = Expr(:tuple, - QuoteNode.(members)..., - QuoteNode.(fieldnames(typeof(base_type)))...) +function _enum_instances_expr(base_type::Type, members) + base_type_sym = nameof(base_type) + members_tuple = Expr(:tuple, members...) return quote - function Base.propertynames(::Type{$(nameof(base_type))}, private::Bool=false) - if private - $private_properties - else - $public_properties - end + function Base.instances(::Type{$base_type}) + return $members_tuple end end end diff --git a/ray_julia_jll/src/wrappers/any.jl b/ray_julia_jll/src/wrappers/any.jl index eb8233d7..95f7cdf7 100644 --- a/ray_julia_jll/src/wrappers/any.jl +++ b/ray_julia_jll/src/wrappers/any.jl @@ -50,23 +50,21 @@ const STATUS_CODE_SYMBOLS = (:OK, :OutOfResource, :ObjectRefEndOfStream) -@eval begin - $(_enum_getproperty_expr(StatusCode, STATUS_CODE_SYMBOLS)) - $(_enum_propertynames_expr(StatusCode, STATUS_CODE_SYMBOLS)) -end - const LANGUAGE_SYMBOLS = (:PYTHON, :JAVA, :CPP, :JULIA) +const WORKER_TYPE_SYMBOLS = (:WORKER, :DRIVER, :SPILL_WORKER, :RESTORE_WORKER) +# Generate the following methods for our wrapped enum types: +# - A constructor allowing you to create a value via a `Symbol` (e.g. `StatusCode(:OK)`). +# - A `instances` method allowing you to get a list of all enum values (e.g. `instances(StatusCode)`) @eval begin - $(_enum_getproperty_expr(Language, LANGUAGE_SYMBOLS)) - $(_enum_propertynames_expr(Language, LANGUAGE_SYMBOLS)) -end + $(_enum_symbol_constructor_expr(StatusCode, STATUS_CODE_SYMBOLS)) + $(_enum_instances_expr(StatusCode, STATUS_CODE_SYMBOLS)) -const WORKER_TYPE_SYMBOLS = (:WORKER, :DRIVER, :SPILL_WORKER, :RESTORE_WORKER) + $(_enum_symbol_constructor_expr(Language, LANGUAGE_SYMBOLS)) + $(_enum_instances_expr(Language, LANGUAGE_SYMBOLS)) -@eval begin - $(_enum_getproperty_expr(WorkerType, WORKER_TYPE_SYMBOLS)) - $(_enum_propertynames_expr(WorkerType, WORKER_TYPE_SYMBOLS)) + $(_enum_symbol_constructor_expr(WorkerType, WORKER_TYPE_SYMBOLS)) + $(_enum_instances_expr(WorkerType, WORKER_TYPE_SYMBOLS)) end function check_status(status::Status)