return None when invalid