Compare commits

...

2 Commits
0.2.0 ... main

Author SHA1 Message Date
95161692f4
correct tests 2023-03-14 13:11:19 +01:00
14ab9bf469
make serve work 2023-03-14 12:42:54 +01:00
4 changed files with 42 additions and 25 deletions

View File

@ -25,7 +25,8 @@ check:
cargo deny check
serve: wasm
cargo run --package woweb
cd woweb; \
cargo run
release: $(DIST_DIR) wasm
cargo build --package woweb --release

View File

@ -1,6 +1,6 @@
use std::fmt::{Display, Formatter};
use crdts::{CmRDT, List};
use crdts::list::Op;
use crdts::{CmRDT, List};
use std::fmt::{Display, Formatter};
#[derive(Clone)]
pub struct Text {
@ -9,9 +9,7 @@ pub struct Text {
impl Default for Text {
fn default() -> Self {
Self {
inner: List::new()
}
Self { inner: List::new() }
}
}
@ -25,14 +23,26 @@ impl Display for Text {
impl Text {
pub fn apply_ops(&mut self, ops: Vec<Op<u16, String>>) {
ops.iter().for_each(move |op| self.inner.apply(op.to_owned()));
ops.iter()
.for_each(move |op| self.inner.apply(op.to_owned()));
}
pub fn insert_linebreak(&mut self, start: usize, end: usize, src: &str) -> Vec<Op<u16, String>> {
pub fn insert_linebreak(
&mut self,
start: usize,
end: usize,
src: &str,
) -> Vec<Op<u16, String>> {
self.insert(start, end, "\n", src)
}
pub fn insert(&mut self, start: usize, end: usize, data: &str, src: &str) -> Vec<Op<u16, String>> {
pub fn insert(
&mut self,
start: usize,
end: usize,
data: &str,
src: &str,
) -> Vec<Op<u16, String>> {
let mut ops: Vec<Op<u16, String>> = Vec::new();
if start < end {
@ -55,14 +65,22 @@ impl Text {
}
pub fn delete_backward(&mut self, start: usize, end: usize, src: &str) -> Vec<Op<u16, String>> {
if (start == 0 && start == end) || end > self.inner.len() { return Vec::new(); }
if (start == 0 && start == end) || end > self.inner.len() {
return Vec::new();
}
let (end, start) = if start == end { (start, start - 1) } else { (end, start) };
let (end, start) = if start == end {
(start, start - 1)
} else {
(end, start)
};
self.delete(start, end, src)
}
pub fn delete_forward(&mut self, start: usize, end: usize, src: &str) -> Vec<Op<u16, String>> {
if start >= self.inner.len() { return Vec::new(); }
if start >= self.inner.len() {
return Vec::new();
}
let end = if start == end { start + 1 } else { end };
self.delete(start, end, src)
@ -104,7 +122,7 @@ mod tests {
#[test]
fn insert_delete() {
let mut t = Text::new();
let mut t = Text::default();
t.insert(0, 0, "Hello", "A");
t.insert(5, 5, "world!", "A");
t.insert(5, 5, ", ", "B");
@ -121,7 +139,7 @@ mod tests {
#[test]
fn backspace() {
let mut t = Text::new();
let mut t = Text::default();
t.insert(0, 0, "Hello", "A");
t.delete_backward(5, 5, "A");
@ -133,7 +151,7 @@ mod tests {
#[test]
fn delete() {
let mut t = Text::new();
let mut t = Text::default();
t.insert(0, 0, "Hello", "A");
t.delete_forward(4, 4, "A");
@ -145,7 +163,7 @@ mod tests {
#[test]
fn linebreak() {
let mut t = Text::new();
let mut t = Text::default();
t.insert(0, 0, "Hello, world!", "A");
t.insert_linebreak(6, 6, "A");
@ -159,10 +177,10 @@ mod tests {
#[test]
fn apply_ops() {
let mut t_a = Text::new();
let mut t_a = Text::default();
let ops_a = t_a.insert(0, 0, "Hello, world!", "A");
let mut t_b = Text::new();
let mut t_b = Text::default();
t_b.apply_ops(ops_a);
assert_eq!(t_b.to_string(), "Hello, world!");
@ -173,7 +191,6 @@ mod tests {
let ops_b = t_b.insert(7, 7, "cruel ", "B");
t_a.apply_ops(ops_b);
assert_eq!(t_a.to_string(), "Hello, cruel distributed world!");
assert_eq!(t_b.to_string(), "Hello, cruel distributed world!");
}

View File

@ -1,13 +1,13 @@
use axum::routing::get;
use axum::Router;
use axum_extra::routing::SpaRouter;
use dist_text::text::Text;
use std::env;
use std::net::SocketAddr;
use std::sync::Arc;
use tokio::sync::{broadcast, RwLock};
use tower_http::trace::TraceLayer;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
use dist_text::text::Text;
mod ws;

View File

@ -9,8 +9,8 @@ use axum::{
response::IntoResponse,
};
use futures::{sink::SinkExt, stream::StreamExt};
use dist_text::crdts::list::Op;
use futures::{sink::SinkExt, stream::StreamExt};
use crate::AppState;
@ -84,6 +84,5 @@ async fn handle_socket(stream: WebSocket, state: Arc<AppState>) {
tokio::select! {
_ = (&mut send_task) => recv_task.abort(),
_ = (&mut recv_task) => send_task.abort(),
}
;
};
}