use sys_locale::get_locale;
use super::activity_stack::UtilityActivity;
-use super::auth::AuthConfig;
+use super::auth::{AuthConfig, AuthError};
use super::client::{AppTokenType, Client, ClientError};
use super::coloured_string::*;
-use super::config::ConfigLocation;
+use super::config::{ConfigError, ConfigLocation};
use super::editor::{
count_edit_chars, EditableMenuLine, EditableMenuLineData,
};
use super::text::*;
use super::tui::{
- ActivityState, CursorPosition, LogicalAction, OurKey, OurKey::*, TuiError,
+ ActivityState, CursorPosition, LogicalAction, OurKey, OurKey::*,
};
use super::types::{Account, Application, Instance};
-use super::TopLevelError;
struct Username {
name: String,
}
}
+pub enum LoginError {
+ Recoverable(ClientError),
+ Fatal(String),
+}
+impl From<ClientError> for LoginError {
+ fn from(err: ClientError) -> Self {
+ LoginError::Recoverable(err)
+ }
+}
+impl From<ConfigError> for LoginError {
+ fn from(err: ConfigError) -> Self {
+ LoginError::Fatal(err.to_string())
+ }
+}
+impl From<AuthError> for LoginError {
+ fn from(err: AuthError) -> Self {
+ LoginError::Fatal(err.to_string())
+ }
+}
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum LoginState {
Initial,
fn verify_login_code_fallible(
&mut self,
client: &mut Client,
- ) -> Result<(), TopLevelError> {
+ ) -> Result<(), LoginError> {
let code = self.el_logincode.get_data().trim();
let app = self
.application
self.state = LoginState::LoginSuccess;
LogicalAction::Nothing
}
- Err(e) => {
+ Err(LoginError::Recoverable(e)) => {
self.para_login_outcome.clear();
self.para_login_outcome.push_text(
ColouredString::uniform(
self.state = LoginState::LoginFailure;
LogicalAction::Beep
}
+ Err(LoginError::Fatal(e)) => LogicalAction::Fatal(e.into()),
}
}
fn register_account_fallible(
&mut self,
client: &mut Client,
- ) -> Result<(), TopLevelError> {
+ ) -> Result<(), LoginError> {
// Register the client and get its details
let app = client.register_client(true)?;
let app_token = client
self.state = LoginState::RegisterFinal;
LogicalAction::Nothing
}
- Err(e) => {
+ Err(LoginError::Recoverable(e)) => {
self.para_login_outcome.clear();
self.para_login_outcome.push_text(
ColouredString::uniform(
self.state = LoginState::RegisterFailure;
LogicalAction::Beep
}
+ Err(LoginError::Fatal(e)) => LogicalAction::Fatal(e.into()),
}
}
&mut self,
client: &mut Client,
with_url: bool,
- ) -> Result<(), TopLevelError> {
+ ) -> Result<(), LoginError> {
if with_url {
let url = self.el_register_confirm.get_data();
client.register_confirmation(url)?;
) -> LogicalAction {
match self.confirm_registration_fallible(client, with_url) {
Ok(_) => LogicalAction::FinishedLoggingIn,
- Err(e) => {
+ Err(LoginError::Recoverable(e)) => {
self.para_regconfirm_outcome.clear();
self.para_regconfirm_outcome.push_text(
ColouredString::uniform(
);
LogicalAction::Beep
}
+ Err(LoginError::Fatal(e)) => LogicalAction::Fatal(e.into()),
}
}
}
pub fn finish_account_setup(
client: &mut Client,
cfgloc: &ConfigLocation,
-) -> Result<(), TuiError> {
+) -> Result<(), LoginError> {
let account: Account = client.verify_account_credentials()?;
let instance: Instance = client.instance()?;
Client, ClientError, FeedExtend, FeedId, StreamId, StreamUpdate,
};
use super::coloured_string::*;
-use super::config::ConfigLocation;
+use super::config::{ConfigError, ConfigLocation};
use super::editor::*;
use super::file::*;
-use super::login::{finish_account_setup, login_menu};
+use super::login::{finish_account_setup, login_menu, LoginError};
use super::menu::*;
use super::options::*;
use super::posting::*;
Del,
}
-#[derive(Debug)]
+#[derive(Debug, PartialEq, Eq, Clone)]
pub struct TuiError {
message: String,
}
impl super::TopLevelErrorCandidate for TuiError {}
+impl From<String> for TuiError {
+ fn from(message: String) -> Self {
+ TuiError { message }
+ }
+}
impl From<std::io::Error> for TuiError {
fn from(err: std::io::Error) -> Self {
TuiError {
}
}
}
+impl From<ConfigError> for TuiError {
+ fn from(err: ConfigError) -> Self {
+ TuiError {
+ message: err.to_string(),
+ }
+ }
+}
impl From<AuthError> for TuiError {
fn from(err: AuthError) -> Self {
TuiError {
}
}
}
+impl From<LoginError> for TuiError {
+ fn from(err: LoginError) -> Self {
+ TuiError {
+ message: match err {
+ LoginError::Recoverable(err) => err.to_string(),
+ LoginError::Fatal(msg) => msg,
+ },
+ }
+ }
+}
impl std::fmt::Display for TuiError {
fn fmt(
Exit,
Nothing,
Error(ClientError), // throw UI into the Error Log
+ Fatal(TuiError), // exit the client completely and whinge
PostComposed(Post),
PostReEdit(Post),
}
logact = match logact {
LogicalAction::Beep => break PhysicalAction::Beep,
LogicalAction::Exit => break PhysicalAction::Exit,
+ LogicalAction::Fatal(e) => break PhysicalAction::Error(e),
LogicalAction::Nothing => break PhysicalAction::Nothing,
LogicalAction::Goto(activity) => {
self.activity_stack.goto(activity);