| 58 | } |
| 59 | |
| 60 | fn not_leader_error( |
| 61 | leader_id: Option<String>, |
| 62 | leader_address: Option<String>, |
| 63 | retry_after_ms: Option<u64>, |
| 64 | ) -> ClientApiError { |
| 65 | let message = match (&leader_address, &leader_id) { |
| 66 | (Some(addr), _) => format!("Not leader, try leader at: {addr}"), |
| 67 | (None, Some(id)) => format!("Not leader, leader_id: {id}"), |
| 68 | (None, None) => "Not leader".to_string(), |
| 69 | }; |
| 70 | |
| 71 | let leader_hint = match (&leader_id, &leader_address) { |
| 72 | (Some(id_str), Some(addr)) => id_str.parse::<u32>().ok().map(|id| LeaderHint { |
| 73 | leader_id: id, |
| 74 | address: addr.clone(), |
| 75 | }), |
| 76 | _ => None, |
| 77 | }; |
| 78 | |
| 79 | ClientApiError::Network { |
| 80 | code: ErrorCode::NotLeader, |
| 81 | message, |
| 82 | retry_after_ms: retry_after_ms.or(Some(100)), |
| 83 | leader_hint, |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | fn server_error(msg: String) -> ClientApiError { |
| 88 | ClientApiError::Business { |