Merge and reorder imports

This change brings them in-line with the default settings of
rust-analyzer. Originally, I disliked this style, but by now, I've grown
used to it and prefer it slightly. Also, I like staying on the default
path since I usually don't need to check the imports to see if
rust-analyzer messed anything up (except for omitting the self:: when
importing modules defined in the current module, grr :D).

I've also come around to the idea of trailing mod definitions instead of
putting them at the top: I would also put module definitions that
contain code instead of referencing another file below the imports. It
feels weird to have code above imports. So it just makes sense to do the
same for all types of mod definitions.

If rustfmt ever gains stable support for grouping imports, I'll probably
use that instead.
This commit is contained in:
Joscha 2025-02-21 12:42:51 +01:00
parent 816d8f86a3
commit fbc64de607
41 changed files with 332 additions and 273 deletions

View file

@ -2,7 +2,7 @@
"files.insertFinalNewline": true, "files.insertFinalNewline": true,
"rust-analyzer.cargo.features": "all", "rust-analyzer.cargo.features": "all",
"rust-analyzer.imports.granularity.enforce": true, "rust-analyzer.imports.granularity.enforce": true,
"rust-analyzer.imports.granularity.group": "module", "rust-analyzer.imports.granularity.group": "crate",
"rust-analyzer.imports.group.enable": true, "rust-analyzer.imports.group.enable": true,
"evenBetterToml.formatter.columnWidth": 100, "evenBetterToml.formatter.columnWidth": 100,
} }

View file

@ -1,7 +1,6 @@
//! Auto-generate markdown documentation. //! Auto-generate markdown documentation.
use std::collections::HashMap; use std::{collections::HashMap, path::PathBuf};
use std::path::PathBuf;
use cove_input::KeyBinding; use cove_input::KeyBinding;
pub use cove_macro::Document; pub use cove_macro::Document;

View file

@ -1,16 +1,17 @@
pub mod doc; use std::{
mod euph; fs,
mod keys; io::{self, ErrorKind},
path::{Path, PathBuf},
use std::io::ErrorKind; };
use std::path::{Path, PathBuf};
use std::{fs, io};
use doc::Document; use doc::Document;
use serde::Deserialize; use serde::Deserialize;
pub use crate::euph::*; pub use crate::{euph::*, keys::*};
pub use crate::keys::*;
pub mod doc;
mod euph;
mod keys;
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
pub enum Error { pub enum Error {

View file

@ -1,10 +1,7 @@
use std::fmt; use std::{fmt, num::ParseIntError, str::FromStr};
use std::num::ParseIntError;
use std::str::FromStr;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
use serde::{Deserialize, Deserializer, de::Error}; use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
use serde::{Serialize, Serializer};
use serde_either::SingleOrVec; use serde_either::SingleOrVec;
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]

View file

@ -1,7 +1,4 @@
mod keys; use std::{io, sync::Arc};
use std::io;
use std::sync::Arc;
pub use cove_macro::KeyGroup; pub use cove_macro::KeyGroup;
use crossterm::event::{Event, KeyEvent, KeyEventKind}; use crossterm::event::{Event, KeyEvent, KeyEventKind};
@ -10,6 +7,8 @@ use toss::{Frame, Terminal, WidthDb};
pub use crate::keys::*; pub use crate::keys::*;
mod keys;
pub struct KeyBindingInfo<'a> { pub struct KeyBindingInfo<'a> {
pub name: &'static str, pub name: &'static str,
pub binding: &'a KeyBinding, pub binding: &'a KeyBinding,

View file

@ -1,7 +1,6 @@
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::quote; use quote::quote;
use syn::spanned::Spanned; use syn::{Data, DataEnum, DataStruct, DeriveInput, Field, Ident, LitStr, spanned::Spanned};
use syn::{Data, DataEnum, DataStruct, DeriveInput, Field, Ident, LitStr};
use crate::util::{self, SerdeDefault}; use crate::util::{self, SerdeDefault};

View file

@ -1,7 +1,6 @@
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::quote; use quote::quote;
use syn::spanned::Spanned; use syn::{Data, DeriveInput, spanned::Spanned};
use syn::{Data, DeriveInput};
use crate::util; use crate::util;

View file

@ -1,8 +1,9 @@
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use quote::quote; use quote::quote;
use syn::parse::Parse; use syn::{
use syn::punctuated::Punctuated; Attribute, Expr, ExprLit, ExprPath, Field, Lit, LitStr, Path, Token, Type, parse::Parse,
use syn::{Attribute, Expr, ExprLit, ExprPath, Field, Lit, LitStr, Path, Token, Type}; punctuated::Punctuated,
};
pub fn bail<T>(span: Span, message: &str) -> syn::Result<T> { pub fn bail<T>(span: Span, message: &str) -> syn::Result<T> {
Err(syn::Error::new(span, message)) Err(syn::Error::new(span, message))

View file

@ -1,7 +1,7 @@
mod room;
mod small_message;
mod util;
pub use room::*; pub use room::*;
pub use small_message::*; pub use small_message::*;
pub use util::*; pub use util::*;
mod room;
mod small_message;
mod util;

View file

@ -1,21 +1,19 @@
// TODO Remove rl2dev-specific code // TODO Remove rl2dev-specific code
use std::convert::Infallible; use std::{convert::Infallible, time::Duration};
use std::time::Duration;
use euphoxide::api::packet::ParsedPacket; use euphoxide::{
use euphoxide::api::{ api::{
Auth, AuthOption, Data, Log, Login, Logout, MessageId, Nick, Send, SendEvent, SendReply, Time, Auth, AuthOption, Data, Log, Login, Logout, MessageId, Nick, Send, SendEvent, SendReply,
UserId, Time, UserId, packet::ParsedPacket,
},
bot::instance::{ConnSnapshot, Event, Instance, InstanceConfig},
conn::{self, ConnTx, Joined},
}; };
use euphoxide::bot::instance::{ConnSnapshot, Event, Instance, InstanceConfig}; use log::{debug, info, warn};
use euphoxide::conn::{self, ConnTx, Joined}; use tokio::{select, sync::oneshot};
use log::{debug, error, info, warn};
use tokio::select;
use tokio::sync::oneshot;
use crate::macros::logging_unwrap; use crate::{macros::logging_unwrap, vault::EuphRoomVault};
use crate::vault::EuphRoomVault;
const LOG_INTERVAL: Duration = Duration::from_secs(10); const LOG_INTERVAL: Duration = Duration::from_secs(10);

View file

@ -5,8 +5,7 @@ use euphoxide::api::{MessageId, Snowflake, Time};
use jiff::Timestamp; use jiff::Timestamp;
use toss::{Style, Styled}; use toss::{Style, Styled};
use crate::store::Msg; use crate::{store::Msg, ui::ChatMsg};
use crate::ui::ChatMsg;
use super::util; use super::util;

View file

@ -1,13 +1,15 @@
//! Export logs from the vault to plain text files. //! Export logs from the vault to plain text files.
use std::{
fs::File,
io::{self, BufWriter, Write},
};
use crate::vault::{EuphRoomVault, EuphVault, RoomIdentifier};
mod json; mod json;
mod text; mod text;
use std::fs::File;
use std::io::{self, BufWriter, Write};
use crate::vault::{EuphRoomVault, EuphVault, RoomIdentifier};
#[derive(Debug, Clone, Copy, clap::ValueEnum)] #[derive(Debug, Clone, Copy, clap::ValueEnum)]
pub enum Format { pub enum Format {
/// Human-readable tree-structured messages. /// Human-readable tree-structured messages.

View file

@ -3,9 +3,7 @@ use std::io::Write;
use euphoxide::api::MessageId; use euphoxide::api::MessageId;
use unicode_width::UnicodeWidthStr; use unicode_width::UnicodeWidthStr;
use crate::euph::SmallMessage; use crate::{euph::SmallMessage, store::Tree, vault::EuphRoomVault};
use crate::store::Tree;
use crate::vault::EuphRoomVault;
const TIME_FORMAT: &str = "%Y-%m-%d %H:%M:%S"; const TIME_FORMAT: &str = "%Y-%m-%d %H:%M:%S";
const TIME_EMPTY: &str = " "; const TIME_EMPTY: &str = " ";

View file

@ -1,6 +1,4 @@
use std::convert::Infallible; use std::{convert::Infallible, sync::Arc, vec};
use std::sync::Arc;
use std::vec;
use async_trait::async_trait; use async_trait::async_trait;
use crossterm::style::Stylize; use crossterm::style::Stylize;
@ -10,8 +8,10 @@ use parking_lot::Mutex;
use tokio::sync::mpsc; use tokio::sync::mpsc;
use toss::{Style, Styled}; use toss::{Style, Styled};
use crate::store::{Msg, MsgStore, Path, Tree}; use crate::{
use crate::ui::ChatMsg; store::{Msg, MsgStore, Path, Tree},
ui::ChatMsg,
};
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct LogMsg { pub struct LogMsg {

View file

@ -1,6 +1,23 @@
// TODO Remove unnecessary Debug impls and compare compile times // TODO Remove unnecessary Debug impls and compare compile times
// TODO Invoke external notification command? // TODO Invoke external notification command?
use std::path::PathBuf;
use anyhow::Context;
use clap::Parser;
use cove_config::{Config, doc::Document};
use directories::{BaseDirs, ProjectDirs};
use log::info;
use tokio::sync::mpsc;
use toss::Terminal;
use crate::{
logger::Logger,
ui::Ui,
vault::Vault,
version::{NAME, VERSION},
};
mod euph; mod euph;
mod export; mod export;
mod logger; mod logger;
@ -11,22 +28,6 @@ mod util;
mod vault; mod vault;
mod version; mod version;
use std::path::PathBuf;
use anyhow::Context;
use clap::Parser;
use cove_config::Config;
use cove_config::doc::Document;
use directories::{BaseDirs, ProjectDirs};
use log::info;
use tokio::sync::mpsc;
use toss::Terminal;
use crate::logger::Logger;
use crate::ui::Ui;
use crate::vault::Vault;
use crate::version::{NAME, VERSION};
#[derive(Debug, clap::Parser)] #[derive(Debug, clap::Parser)]
enum Command { enum Command {
/// Run the client interactively (default). /// Run the client interactively (default).

View file

@ -1,7 +1,4 @@
use std::collections::HashMap; use std::{collections::HashMap, fmt::Debug, hash::Hash, vec};
use std::fmt::Debug;
use std::hash::Hash;
use std::vec;
use async_trait::async_trait; use async_trait::async_trait;

View file

@ -1,3 +1,30 @@
use std::{
convert::Infallible,
io,
sync::{Arc, Weak},
time::{Duration, Instant},
};
use cove_config::Config;
use cove_input::InputEvent;
use jiff::tz::TimeZone;
use parking_lot::FairMutex;
use tokio::{
sync::mpsc::{self, UnboundedReceiver, UnboundedSender, error::TryRecvError},
task,
};
use toss::{Terminal, WidgetExt, widgets::BoxedAsync};
use crate::{
logger::{LogMsg, Logger},
macros::logging_unwrap,
util::InfallibleExt,
vault::Vault,
};
pub use self::chat::ChatMsg;
use self::{chat::ChatState, rooms::Rooms, widgets::ListState};
mod chat; mod chat;
mod euph; mod euph;
mod key_bindings; mod key_bindings;
@ -5,31 +32,6 @@ mod rooms;
mod util; mod util;
mod widgets; mod widgets;
use std::convert::Infallible;
use std::io;
use std::sync::{Arc, Weak};
use std::time::{Duration, Instant};
use cove_config::Config;
use cove_input::InputEvent;
use jiff::tz::TimeZone;
use parking_lot::FairMutex;
use tokio::sync::mpsc::error::TryRecvError;
use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender};
use tokio::task;
use toss::widgets::BoxedAsync;
use toss::{Terminal, WidgetExt};
use crate::logger::{LogMsg, Logger};
use crate::macros::logging_unwrap;
use crate::util::InfallibleExt;
use crate::vault::Vault;
pub use self::chat::ChatMsg;
use self::chat::ChatState;
use self::rooms::Rooms;
use self::widgets::ListState;
/// Time to spend batch processing events before redrawing the screen. /// Time to spend batch processing events before redrawing the screen.
const EVENT_PROCESSING_TIME: Duration = Duration::from_millis(1000 / 15); // 15 fps const EVENT_PROCESSING_TIME: Duration = Duration::from_millis(1000 / 15); // 15 fps

View file

@ -1,24 +1,26 @@
use cove_config::Keys;
use cove_input::InputEvent;
use jiff::{Timestamp, tz::TimeZone};
use toss::{
Styled, WidgetExt,
widgets::{BoxedAsync, EditorState},
};
use crate::{
store::{Msg, MsgStore},
util,
};
use super::UiError;
use self::{cursor::Cursor, tree::TreeViewState};
mod blocks; mod blocks;
mod cursor; mod cursor;
mod renderer; mod renderer;
mod tree; mod tree;
mod widgets; mod widgets;
use cove_config::Keys;
use cove_input::InputEvent;
use jiff::Timestamp;
use jiff::tz::TimeZone;
use toss::widgets::{BoxedAsync, EditorState};
use toss::{Styled, WidgetExt};
use crate::store::{Msg, MsgStore};
use crate::util;
use self::cursor::Cursor;
use self::tree::TreeViewState;
use super::UiError;
pub trait ChatMsg { pub trait ChatMsg {
fn time(&self) -> Option<Timestamp>; fn time(&self) -> Option<Timestamp>;
fn styled(&self) -> (Styled, Styled); fn styled(&self) -> (Styled, Styled);

View file

@ -1,7 +1,6 @@
//! Common cursor movement logic. //! Common cursor movement logic.
use std::collections::HashSet; use std::{collections::HashSet, hash::Hash};
use std::hash::Hash;
use crate::store::{Msg, MsgStore, Tree}; use crate::store::{Msg, MsgStore, Tree};

View file

@ -2,27 +2,27 @@
// TODO Focusing on sub-trees // TODO Focusing on sub-trees
mod renderer;
mod scroll;
mod widgets;
use std::collections::HashSet; use std::collections::HashSet;
use async_trait::async_trait; use async_trait::async_trait;
use cove_config::Keys; use cove_config::Keys;
use cove_input::InputEvent; use cove_input::InputEvent;
use jiff::tz::TimeZone; use jiff::tz::TimeZone;
use toss::widgets::EditorState; use toss::{AsyncWidget, Frame, Pos, Size, WidgetExt, WidthDb, widgets::EditorState};
use toss::{AsyncWidget, Frame, Pos, Size, WidgetExt, WidthDb};
use crate::store::{Msg, MsgStore}; use crate::{
use crate::ui::{ChatMsg, UiError, util}; store::{Msg, MsgStore},
use crate::util::InfallibleExt; ui::{UiError, util},
util::InfallibleExt,
};
use super::{ChatMsg, Reaction, cursor::Cursor};
use self::renderer::{TreeContext, TreeRenderer}; use self::renderer::{TreeContext, TreeRenderer};
use super::Reaction; mod renderer;
use super::cursor::Cursor; mod scroll;
mod widgets;
pub struct TreeViewState<M: Msg, S: MsgStore<M>> { pub struct TreeViewState<M: Msg, S: MsgStore<M>> {
store: S, store: S,

View file

@ -1,19 +1,26 @@
//! A [`Renderer`] for message trees. //! A [`Renderer`] for message trees.
use std::collections::HashSet; use std::{collections::HashSet, convert::Infallible};
use std::convert::Infallible;
use async_trait::async_trait; use async_trait::async_trait;
use jiff::tz::TimeZone; use jiff::tz::TimeZone;
use toss::widgets::{EditorState, Empty, Predrawn, Resize}; use toss::{
use toss::{Size, Widget, WidthDb}; Size, Widget, WidthDb,
widgets::{EditorState, Empty, Predrawn, Resize},
};
use crate::store::{Msg, MsgStore, Tree}; use crate::{
use crate::ui::ChatMsg; store::{Msg, MsgStore, Tree},
use crate::ui::chat::blocks::{Block, Blocks, Range}; ui::{
use crate::ui::chat::cursor::Cursor; ChatMsg,
use crate::ui::chat::renderer::{self, Renderer, overlaps}; chat::{
use crate::util::InfallibleExt; blocks::{Block, Blocks, Range},
cursor::Cursor,
renderer::{self, Renderer, overlaps},
},
},
util::InfallibleExt,
};
use super::widgets; use super::widgets;

View file

@ -1,12 +1,14 @@
use toss::WidthDb; use toss::{WidthDb, widgets::EditorState};
use toss::widgets::EditorState;
use crate::store::{Msg, MsgStore}; use crate::{
use crate::ui::ChatMsg; store::{Msg, MsgStore},
use crate::ui::chat::cursor::Cursor; ui::{ChatMsg, chat::cursor::Cursor},
};
use super::TreeViewState; use super::{
use super::renderer::{TreeContext, TreeRenderer}; TreeViewState,
renderer::{TreeContext, TreeRenderer},
};
impl<M, S> TreeViewState<M, S> impl<M, S> TreeViewState<M, S>
where where

View file

@ -2,13 +2,19 @@ use std::convert::Infallible;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use jiff::tz::TimeZone; use jiff::tz::TimeZone;
use toss::widgets::{Boxed, EditorState, Join2, Join4, Join5, Text}; use toss::{
use toss::{Style, Styled, WidgetExt}; Style, Styled, WidgetExt,
widgets::{Boxed, EditorState, Join2, Join4, Join5, Text},
};
use crate::store::Msg; use crate::{
use crate::ui::ChatMsg; store::Msg,
use crate::ui::chat::widgets::{Indent, Seen, Time}; ui::{
use crate::util; ChatMsg,
chat::widgets::{Indent, Seen, Time},
},
util,
};
pub const PLACEHOLDER: &str = "[...]"; pub const PLACEHOLDER: &str = "[...]";

View file

@ -2,8 +2,10 @@ use std::convert::Infallible;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use jiff::Zoned; use jiff::Zoned;
use toss::widgets::{Boxed, Empty, Text}; use toss::{
use toss::{Frame, Pos, Size, Style, Widget, WidgetExt, WidthDb}; Frame, Pos, Size, Style, Widget, WidgetExt, WidthDb,
widgets::{Boxed, Empty, Text},
};
use crate::util::InfallibleExt; use crate::util::InfallibleExt;

View file

@ -1,14 +1,16 @@
use cove_config::Keys; use cove_config::Keys;
use cove_input::InputEvent; use cove_input::InputEvent;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use euphoxide::api::PersonalAccountView; use euphoxide::{api::PersonalAccountView, conn};
use euphoxide::conn; use toss::{
use toss::widgets::{EditorState, Empty, Join3, Join4, Join5, Text}; Style, Widget, WidgetExt,
use toss::{Style, Widget, WidgetExt}; widgets::{EditorState, Empty, Join3, Join4, Join5, Text},
};
use crate::euph::{self, Room}; use crate::{
use crate::ui::widgets::Popup; euph::{self, Room},
use crate::ui::{UiError, util}; ui::{UiError, util, widgets::Popup},
};
use super::popup::PopupResult; use super::popup::PopupResult;

View file

@ -1,11 +1,11 @@
use cove_config::Keys; use cove_config::Keys;
use cove_input::InputEvent; use cove_input::InputEvent;
use toss::Widget; use toss::{Widget, widgets::EditorState};
use toss::widgets::EditorState;
use crate::euph::Room; use crate::{
use crate::ui::widgets::Popup; euph::Room,
use crate::ui::{UiError, util}; ui::{UiError, util, widgets::Popup},
};
use super::popup::PopupResult; use super::popup::PopupResult;

View file

@ -1,13 +1,13 @@
use cove_config::Keys; use cove_config::Keys;
use cove_input::InputEvent; use cove_input::InputEvent;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use euphoxide::api::{Message, NickEvent, SessionView}; use euphoxide::{
use euphoxide::conn::SessionInfo; api::{Message, NickEvent, SessionView},
use toss::widgets::Text; conn::SessionInfo,
use toss::{Style, Styled, Widget}; };
use toss::{Style, Styled, Widget, widgets::Text};
use crate::ui::UiError; use crate::ui::{UiError, widgets::Popup};
use crate::ui::widgets::Popup;
use super::popup::PopupResult; use super::popup::PopupResult;

View file

@ -1,13 +1,16 @@
use cove_config::{Config, Keys}; use cove_config::{Config, Keys};
use cove_input::InputEvent; use cove_input::InputEvent;
use crossterm::event::KeyCode; use crossterm::{event::KeyCode, style::Stylize};
use crossterm::style::Stylize;
use linkify::{LinkFinder, LinkKind}; use linkify::{LinkFinder, LinkKind};
use toss::widgets::{Join2, Text}; use toss::{
use toss::{Style, Styled, Widget, WidgetExt}; Style, Styled, Widget, WidgetExt,
widgets::{Join2, Text},
};
use crate::ui::widgets::{ListBuilder, ListState, Popup}; use crate::ui::{
use crate::ui::{UiError, key_bindings, util}; UiError, key_bindings, util,
widgets::{ListBuilder, ListState, Popup},
};
use super::popup::PopupResult; use super::popup::PopupResult;

View file

@ -1,12 +1,12 @@
use cove_config::Keys; use cove_config::Keys;
use cove_input::InputEvent; use cove_input::InputEvent;
use euphoxide::conn::Joined; use euphoxide::conn::Joined;
use toss::widgets::EditorState; use toss::{Style, Widget, widgets::EditorState};
use toss::{Style, Widget};
use crate::euph::{self, Room}; use crate::{
use crate::ui::widgets::Popup; euph::{self, Room},
use crate::ui::{UiError, util}; ui::{UiError, util, widgets::Popup},
};
use super::popup::PopupResult; use super::popup::PopupResult;

View file

@ -1,14 +1,22 @@
use std::iter; use std::iter;
use crossterm::style::{Color, Stylize}; use crossterm::style::{Color, Stylize};
use euphoxide::api::{NickEvent, SessionId, SessionType, SessionView, UserId}; use euphoxide::{
use euphoxide::conn::{Joined, SessionInfo}; api::{NickEvent, SessionId, SessionType, SessionView, UserId},
use toss::widgets::{Background, Text}; conn::{Joined, SessionInfo},
use toss::{Style, Styled, Widget, WidgetExt}; };
use toss::{
Style, Styled, Widget, WidgetExt,
widgets::{Background, Text},
};
use crate::euph; use crate::{
use crate::ui::UiError; euph,
use crate::ui::widgets::{ListBuilder, ListState}; ui::{
UiError,
widgets::{ListBuilder, ListState},
},
};
pub fn widget<'a>( pub fn widget<'a>(
list: &'a mut ListState<SessionId>, list: &'a mut ListState<SessionId>,

View file

@ -1,11 +1,9 @@
use std::io; use std::io;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use toss::widgets::Text; use toss::{Style, Styled, Widget, widgets::Text};
use toss::{Style, Styled, Widget};
use crate::ui::UiError; use crate::ui::{UiError, widgets::Popup};
use crate::ui::widgets::Popup;
pub enum RoomPopup { pub enum RoomPopup {
Error { description: String, reason: String }, Error { description: String, reason: String },

View file

@ -3,26 +3,40 @@ use std::collections::VecDeque;
use cove_config::{Config, Keys}; use cove_config::{Config, Keys};
use cove_input::InputEvent; use cove_input::InputEvent;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use euphoxide::api::{Data, Message, MessageId, PacketType, SessionId}; use euphoxide::{
use euphoxide::bot::instance::{Event, ServerConfig}; api::{Data, Message, MessageId, PacketType, SessionId},
use euphoxide::conn::{self, Joined, Joining, SessionInfo}; bot::instance::{Event, ServerConfig},
conn::{self, Joined, Joining, SessionInfo},
};
use jiff::tz::TimeZone; use jiff::tz::TimeZone;
use tokio::sync::oneshot::error::TryRecvError; use tokio::sync::{
use tokio::sync::{mpsc, oneshot}; mpsc,
use toss::widgets::{BoxedAsync, EditorState, Join2, Layer, Text}; oneshot::{self, error::TryRecvError},
use toss::{Style, Styled, Widget, WidgetExt}; };
use toss::{
Style, Styled, Widget, WidgetExt,
widgets::{BoxedAsync, EditorState, Join2, Layer, Text},
};
use crate::euph; use crate::{
use crate::macros::logging_unwrap; euph,
use crate::ui::chat::{ChatState, Reaction}; macros::logging_unwrap,
use crate::ui::widgets::ListState; ui::{
use crate::ui::{UiError, UiEvent, util}; UiError, UiEvent,
use crate::vault::EuphRoomVault; chat::{ChatState, Reaction},
util,
widgets::ListState,
},
vault::EuphRoomVault,
};
use super::account::AccountUiState; use super::{
use super::links::LinksState; account::AccountUiState,
use super::popup::{PopupResult, RoomPopup}; auth, inspect,
use super::{auth, inspect, nick, nick_list}; links::LinksState,
nick, nick_list,
popup::{PopupResult, RoomPopup},
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum Focus { enum Focus {

View file

@ -5,11 +5,15 @@ use std::convert::Infallible;
use cove_config::{Config, Keys}; use cove_config::{Config, Keys};
use cove_input::{InputEvent, KeyBinding, KeyBindingInfo, KeyGroupInfo}; use cove_input::{InputEvent, KeyBinding, KeyBindingInfo, KeyGroupInfo};
use crossterm::style::Stylize; use crossterm::style::Stylize;
use toss::widgets::{Either2, Join2, Padding, Text}; use toss::{
use toss::{Style, Styled, Widget, WidgetExt}; Style, Styled, Widget, WidgetExt,
widgets::{Either2, Join2, Padding, Text},
};
use super::widgets::{ListBuilder, ListState, Popup}; use super::{
use super::{UiError, util}; UiError, util,
widgets::{ListBuilder, ListState, Popup},
};
type Line = Either2<Text, Join2<Padding<Text>, Text>>; type Line = Either2<Text, Join2<Padding<Text>, Text>>;
type Builder = ListBuilder<'static, Infallible, Line>; type Builder = ListBuilder<'static, Infallible, Line>;

View file

@ -1,34 +1,46 @@
mod connect; use std::{
mod delete; collections::{HashMap, HashSet, hash_map::Entry},
iter,
use std::collections::hash_map::Entry; sync::{Arc, Mutex},
use std::collections::{HashMap, HashSet}; time::Duration,
use std::iter; };
use std::sync::{Arc, Mutex};
use std::time::Duration;
use cove_config::{Config, Keys, RoomsSortOrder}; use cove_config::{Config, Keys, RoomsSortOrder};
use cove_input::InputEvent; use cove_input::InputEvent;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use euphoxide::api::SessionType; use euphoxide::{
use euphoxide::bot::instance::{Event, ServerConfig}; api::SessionType,
use euphoxide::conn::{self, Joined}; bot::instance::{Event, ServerConfig},
conn::{self, Joined},
};
use jiff::tz::TimeZone; use jiff::tz::TimeZone;
use tokio::sync::mpsc; use tokio::sync::mpsc;
use toss::widgets::{BoxedAsync, Empty, Join2, Text}; use toss::{
use toss::{Style, Styled, Widget, WidgetExt}; Style, Styled, Widget, WidgetExt,
widgets::{BoxedAsync, Empty, Join2, Text},
};
use crate::euph; use crate::{
use crate::macros::logging_unwrap; euph,
use crate::vault::{EuphVault, RoomIdentifier, Vault}; macros::logging_unwrap,
use crate::version::{NAME, VERSION}; vault::{EuphVault, RoomIdentifier, Vault},
version::{NAME, VERSION},
};
use self::connect::{ConnectResult, ConnectState}; use super::{
use self::delete::{DeleteResult, DeleteState}; UiError, UiEvent,
euph::room::EuphRoom,
key_bindings, util,
widgets::{ListBuilder, ListState},
};
use super::euph::room::EuphRoom; use self::{
use super::widgets::{ListBuilder, ListState}; connect::{ConnectResult, ConnectState},
use super::{UiError, UiEvent, key_bindings, util}; delete::{DeleteResult, DeleteState},
};
mod connect;
mod delete;
enum State { enum State {
ShowList, ShowList,

View file

@ -1,12 +1,15 @@
use cove_config::Keys; use cove_config::Keys;
use cove_input::InputEvent; use cove_input::InputEvent;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use toss::widgets::{EditorState, Empty, Join2, Join3, Text}; use toss::{
use toss::{Style, Styled, Widget, WidgetExt}; Style, Styled, Widget, WidgetExt,
widgets::{EditorState, Empty, Join2, Join3, Text},
};
use crate::ui::widgets::Popup; use crate::{
use crate::ui::{UiError, util}; ui::{UiError, util, widgets::Popup},
use crate::vault::RoomIdentifier; vault::RoomIdentifier,
};
#[derive(Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy, PartialEq, Eq)]
enum Focus { enum Focus {

View file

@ -1,12 +1,15 @@
use cove_config::Keys; use cove_config::Keys;
use cove_input::InputEvent; use cove_input::InputEvent;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use toss::widgets::{EditorState, Empty, Join2, Text}; use toss::{
use toss::{Style, Styled, Widget, WidgetExt}; Style, Styled, Widget, WidgetExt,
widgets::{EditorState, Empty, Join2, Text},
};
use crate::ui::widgets::Popup; use crate::{
use crate::ui::{UiError, util}; ui::{UiError, util, widgets::Popup},
use crate::vault::RoomIdentifier; vault::RoomIdentifier,
};
pub struct DeleteState { pub struct DeleteState {
id: RoomIdentifier, id: RoomIdentifier,

View file

@ -1,5 +1,5 @@
mod list;
mod popup;
pub use self::list::*; pub use self::list::*;
pub use self::popup::*; pub use self::popup::*;
mod list;
mod popup;

View file

@ -1,5 +1,7 @@
use toss::widgets::{Background, Border, Desync, Float, Layer2, Padding, Text}; use toss::{
use toss::{Frame, Size, Style, Styled, Widget, WidgetExt, WidthDb}; Frame, Size, Style, Styled, Widget, WidgetExt, WidthDb,
widgets::{Background, Border, Desync, Float, Layer2, Padding, Text},
};
type Body<I> = Background<Border<Padding<I>>>; type Body<I> = Background<Border<Padding<I>>>;
type Title = Float<Padding<Background<Padding<Text>>>>; type Title = Float<Padding<Background<Padding<Text>>>>;

View file

@ -1,5 +1,4 @@
use std::convert::Infallible; use std::{convert::Infallible, env};
use std::env;
use jiff::tz::TimeZone; use jiff::tz::TimeZone;

View file

@ -1,16 +1,14 @@
use std::{fs, path::Path};
use rusqlite::Connection;
use vault::{Action, tokio::TokioVault};
pub use self::euph::{EuphRoomVault, EuphVault, RoomIdentifier};
mod euph; mod euph;
mod migrate; mod migrate;
mod prepare; mod prepare;
use std::fs;
use std::path::Path;
use rusqlite::Connection;
use vault::Action;
use vault::tokio::TokioVault;
pub use self::euph::{EuphRoomVault, EuphVault, RoomIdentifier};
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Vault { pub struct Vault {
tokio_vault: TokioVault, tokio_vault: TokioVault,

View file

@ -1,15 +1,18 @@
use std::str::FromStr; use std::{fmt, mem, str::FromStr};
use std::{fmt, mem};
use async_trait::async_trait; use async_trait::async_trait;
use cookie::{Cookie, CookieJar}; use cookie::{Cookie, CookieJar};
use euphoxide::api::{Message, MessageId, SessionId, SessionView, Snowflake, Time, UserId}; use euphoxide::api::{Message, MessageId, SessionId, SessionView, Snowflake, Time, UserId};
use rusqlite::types::{FromSql, FromSqlError, ToSqlOutput, Value, ValueRef}; use rusqlite::{
use rusqlite::{Connection, OptionalExtension, Row, ToSql, Transaction, named_params, params}; Connection, OptionalExtension, Row, ToSql, Transaction, named_params, params,
types::{FromSql, FromSqlError, ToSqlOutput, Value, ValueRef},
};
use vault::Action; use vault::Action;
use crate::euph::SmallMessage; use crate::{
use crate::store::{MsgStore, Path, Tree}; euph::SmallMessage,
store::{MsgStore, Path, Tree},
};
/// Wrapper for [`Snowflake`] that implements useful rusqlite traits. /// Wrapper for [`Snowflake`] that implements useful rusqlite traits.
struct WSnowflake(Snowflake); struct WSnowflake(Snowflake);