todo: create result patern (error + data)