type ParseKind[T: static NextState] = distinct void proc parseIt(...; kind: ParseKind[Status]): YourRetType proc parseIt(...; kind: ParseKind[Login]): YourOtherRetType # Have your macro emit case theKind of Login: parseIt(..., Login) of Status: parseIt(..., Status)