Show the reason why a join request was declined

Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Antonio Scandurra 2022-05-16 19:56:10 +02:00
parent 740ec3d192
commit ed6ed99d8f
6 changed files with 203 additions and 17 deletions

View file

@ -45,6 +45,7 @@ serde_json = { version = "1.0.64", features = ["preserve_order"] }
sha2 = "0.10"
similar = "1.3"
smol = "1.2.5"
thiserror = "1.0.29"
toml = "0.5"
[dev-dependencies]

View file

@ -49,6 +49,7 @@ use std::{
},
time::Instant,
};
use thiserror::Error;
use util::{post_inc, ResultExt, TryFutureExt as _};
pub use fs::*;
@ -90,6 +91,18 @@ pub struct Project {
nonce: u128,
}
#[derive(Error, Debug)]
pub enum JoinProjectError {
#[error("host declined join request")]
HostDeclined,
#[error("host closed the project")]
HostClosedProject,
#[error("host went offline")]
HostWentOffline,
#[error("{0}")]
Other(#[from] anyhow::Error),
}
enum OpenBuffer {
Strong(ModelHandle<Buffer>),
Weak(WeakModelHandle<Buffer>),
@ -356,7 +369,7 @@ impl Project {
languages: Arc<LanguageRegistry>,
fs: Arc<dyn Fs>,
cx: &mut AsyncAppContext,
) -> Result<ModelHandle<Self>> {
) -> Result<ModelHandle<Self>, JoinProjectError> {
client.authenticate_and_connect(true, &cx).await?;
let response = client
@ -367,7 +380,20 @@ impl Project {
let response = match response.variant.ok_or_else(|| anyhow!("missing variant"))? {
proto::join_project_response::Variant::Accept(response) => response,
proto::join_project_response::Variant::Decline(_) => Err(anyhow!("rejected"))?,
proto::join_project_response::Variant::Decline(decline) => {
match proto::join_project_response::decline::Reason::from_i32(decline.reason) {
Some(proto::join_project_response::decline::Reason::Declined) => {
Err(JoinProjectError::HostDeclined)?
}
Some(proto::join_project_response::decline::Reason::Closed) => {
Err(JoinProjectError::HostClosedProject)?
}
Some(proto::join_project_response::decline::Reason::WentOffline) => {
Err(JoinProjectError::HostWentOffline)?
}
None => Err(anyhow!("missing decline reason"))?,
}
}
};
let replica_id = response.replica_id as ReplicaId;