implement user skeleton struct
This commit is contained in:
commit
dd15b606b8
7 changed files with 158 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
/target
|
||||
**/*.rs.bk
|
||||
Cargo.lock
|
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "libmatrix-client"
|
||||
version = "0.1.0"
|
||||
authors = ["Edward Shen <code@eddie.sh>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
19
src/api/mod.rs
Normal file
19
src/api/mod.rs
Normal file
|
@ -0,0 +1,19 @@
|
|||
use std::fmt;
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
pub struct Client {}
|
||||
|
||||
impl Client{
|
||||
pub fn new() -> Self {
|
||||
Client {}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct ApiError {}
|
||||
|
||||
impl fmt::Display for ApiError {
|
||||
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(formatter, "an error occurred!")
|
||||
}
|
||||
}
|
0
src/client/mod.rs
Normal file
0
src/client/mod.rs
Normal file
6
src/lib.rs
Normal file
6
src/lib.rs
Normal file
|
@ -0,0 +1,6 @@
|
|||
#![forbid(unsafe_code)]
|
||||
|
||||
mod api;
|
||||
mod client;
|
||||
mod room;
|
||||
mod user;
|
1
src/room/mod.rs
Normal file
1
src/room/mod.rs
Normal file
|
@ -0,0 +1 @@
|
|||
pub struct Room {}
|
120
src/user.rs
Normal file
120
src/user.rs
Normal file
|
@ -0,0 +1,120 @@
|
|||
use crate::api::{ApiError, Client};
|
||||
use crate::room::Room;
|
||||
use std::fmt;
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
enum UserInitErrorReason {
|
||||
InvalidUsername,
|
||||
NoDomainProvided,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
struct UserInitError {
|
||||
message: String,
|
||||
reason: UserInitErrorReason,
|
||||
}
|
||||
|
||||
impl UserInitError {
|
||||
fn new(msg: &str, reason: UserInitErrorReason) -> Self {
|
||||
UserInitError {
|
||||
message: msg.to_string(),
|
||||
reason,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for UserInitError {
|
||||
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(formatter, "{}", self.message)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
struct User {
|
||||
id: String,
|
||||
display_name: Option<String>,
|
||||
client: Client,
|
||||
}
|
||||
|
||||
impl User {
|
||||
/// Constructs a new User. This represents a user in a room.
|
||||
///
|
||||
/// # Arguments
|
||||
/// - `id` - The fully qualified user id, following the form @user:domain. Currently, this only
|
||||
/// checks whether the id starts with `@` and contains a `:`.
|
||||
/// - `display_name` - Some display name to use??? TODO: Figure out what this does
|
||||
///
|
||||
/// Returns either a new User struct or an error containing the reason why it failed to create a
|
||||
/// new User.
|
||||
pub fn new(id: String, display_name: Option<String>) -> Result<Self, UserInitError> {
|
||||
if !id.starts_with("@") {
|
||||
Err(UserInitError::new(
|
||||
"User ID must start with a @",
|
||||
UserInitErrorReason::InvalidUsername,
|
||||
))
|
||||
} else if !id.contains(":") {
|
||||
Err(UserInitError::new(
|
||||
"User ID must contain a :",
|
||||
UserInitErrorReason::NoDomainProvided,
|
||||
))
|
||||
} else {
|
||||
Ok(User {
|
||||
id,
|
||||
display_name,
|
||||
client: Client::new(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fn get_display_name(room: Room) -> String {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn set_display_name(&mut self, name: &str) -> Result<(), ApiError> {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn get_avatar_url() -> Result<String, ApiError> {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn set_avatar_url(url: &str) -> Result<(), ApiError> {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn new_returns_err_on_invalid_id() {
|
||||
assert_eq!(
|
||||
User::new(String::from("abc:edf"), None),
|
||||
Err(UserInitError {
|
||||
message: "User ID must start with a @".to_string(),
|
||||
reason: UserInitErrorReason::InvalidUsername
|
||||
})
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
User::new(String::from("@abcedf"), None),
|
||||
Err(UserInitError {
|
||||
message: "User ID must contain a :".to_string(),
|
||||
reason: UserInitErrorReason::NoDomainProvided
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn new_returns_struct_on_valid_input() {
|
||||
assert_eq!(
|
||||
User::new("@eddie:eddie.sh".to_string(), None),
|
||||
Ok(User {
|
||||
id: "@eddie:eddie.sh".to_string(),
|
||||
display_name: None,
|
||||
client: Client::new()
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue