Well it does not even need a macro the above works fine simply modified.
import std/options
proc toEnum*(val: SomeInteger, E: typedesc[enum]): Option[E] =
const enmRange = E.low.ord .. E.high.ord
when E is Ordinal:
if val in enmRange:
some(val)
else:
none(E)
else:
if val in enmRange and val.E in E.enumElementsAsSet:
some(val)
else:
none(E)
Run
- Safe `enum` conversion arnetheduck
- Safe `enum` conversion ElegantBeef
- Safe `enum` conversion mildred
- Safe `enum` conversion ElegantBeef
- Safe `enum` conversion planetis
- Safe `enum` conversion Zoom
- Safe `enum` conversion ynfle
- Safe `enum` conversion arnetheduck
- Safe `enum` conversion cumulonimbus
- Safe `enum` conversion ElegantBeef
- Safe `enum` conversion lscrd
- Safe `enum` conversion ElegantBeef
- Safe `enum` conversion arnetheduck
- Safe `enum` conversion arnetheduck
