also seems that `raise`, `ok`, `message`, `data` should be in an enum