From d52bf70cc3af91d18f57d65c91a282ec777c55df Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Sat, 25 Jan 2025 11:19:02 -0500 Subject: [PATCH] wip: color styling commands for rows and cols --- src/ui/cmd.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++--- src/ui/test.rs | 45 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 3 deletions(-) diff --git a/src/ui/cmd.rs b/src/ui/cmd.rs index 225878f..2a4e092 100644 --- a/src/ui/cmd.rs +++ b/src/ui/cmd.rs @@ -7,8 +7,8 @@ pub enum Cmd<'a> { Write(Option<&'a str>), InsertRows(usize), InsertColumns(usize), - ColorRows(usize, &'a str), - ColorColumns(usize, &'a str), + ColorRows(Option, &'a str), + ColorColumns(Option, &'a str), ColorCell(&'a str), RenameSheet(Option, &'a str), NewSheet(Option<&'a str>), @@ -54,6 +54,12 @@ pub fn parse<'cmd, 'i: 'cmd>(input: &'i str) -> Result>, &'stat if let Some(cmd) = try_consume_rename_sheet(cursor.clone())? { return Ok(Some(cmd)); } + if let Some(cmd) = try_consume_color_rows(cursor.clone())? { + return Ok(Some(cmd)); + } + if let Some(cmd) = try_consume_color_columns(cursor.clone())? { + return Ok(Some(cmd)); + } if let Some(cmd) = try_consume_color_cell(cursor.clone())? { return Ok(Some(cmd)); } @@ -306,11 +312,51 @@ fn try_consume_rename_sheet<'cmd, 'i: 'cmd>( let (idx, rest) = try_consume_usize(input.clone()); let arg = rest.span(0..).trim(); if arg.is_empty() { - return Err("Invalid command: `rename-sheet` requires a sheet name argument?"); + return Err("Invalid command: `rename-sheet` requires a sheet name argument"); } return Ok(Some(Cmd::RenameSheet(idx, arg))); } +fn try_consume_color_rows<'cmd, 'i: 'cmd>( + mut input: StrCursor<'i>, +) -> Result>, &'static str> { + const LONG: &'static str = "color-rows"; + if compare(input.clone(), LONG) { + input.seek(LONG.len()); + } else { + return Ok(None); + } + if input.remaining() > 0 && !is_ws(&mut input) { + return Err("Invalid command: Did you mean to type `color-rows [count] `?"); + } + let (idx, rest) = try_consume_usize(input.clone()); + let arg = rest.span(0..).trim(); + if arg.is_empty() { + return Err("Invalid command: `color-rows` requires a color argument"); + } + return Ok(Some(Cmd::ColorRows(idx, arg))); +} + +fn try_consume_color_columns<'cmd, 'i: 'cmd>( + mut input: StrCursor<'i>, +) -> Result>, &'static str> { + const LONG: &'static str = "color-columns"; + if compare(input.clone(), LONG) { + input.seek(LONG.len()); + } else { + return Ok(None); + } + if input.remaining() > 0 && !is_ws(&mut input) { + return Err("Invalid command: Did you mean to type `color-columns [count] `?"); + } + let (idx, rest) = try_consume_usize(input.clone()); + let arg = rest.span(0..).trim(); + if arg.is_empty() { + return Err("Invalid command: `color-columns` requires a color argument"); + } + return Ok(Some(Cmd::ColorColumns(idx, arg))); +} + fn try_consume_usize<'cmd, 'i: 'cmd>( mut input: StrCursor<'i>, ) -> (Option, StrCursor<'i>) { diff --git a/src/ui/test.rs b/src/ui/test.rs index 90df20d..5f22d0f 100644 --- a/src/ui/test.rs +++ b/src/ui/test.rs @@ -259,6 +259,51 @@ fn test_cmd_rename_sheet_with_idx_and_name() { assert_eq!(cmd, Cmd::RenameSheet(Some(0), "test")); } +#[test] +fn test_cmd_color_rows_with_color() { + let input = "color-rows red"; + let result = parse(input); + assert!(result.is_ok()); + let output = result.unwrap(); + assert!(output.is_some()); + let cmd = output.unwrap(); + assert_eq!(cmd, Cmd::ColorRows(None, "red")); +} + +#[test] +fn test_cmd_color_rows_with_idx_and_color() { + let input = "color-rows 1 red"; + let result = parse(input); + assert!(result.is_ok()); + let output = result.unwrap(); + assert!(output.is_some()); + let cmd = output.unwrap(); + assert_eq!(cmd, Cmd::ColorRows(Some(1), "red")); +} + +#[test] +fn test_cmd_color_columns_with_color() { + let input = "color-columns red"; + let result = parse(input); + assert!(result.is_ok()); + let output = result.unwrap(); + assert!(output.is_some()); + let cmd = output.unwrap(); + assert_eq!(cmd, Cmd::ColorColumns(None, "red")); +} + +#[test] +fn test_cmd_color_columns_with_idx_and_color() { + let input = "color-columns 1 red"; + let result = parse(input); + assert!(result.is_ok()); + let output = result.unwrap(); + assert!(output.is_some()); + let cmd = output.unwrap(); + assert_eq!(cmd, Cmd::ColorColumns(Some(1), "red")); +} + + #[test] fn test_input_navitation_enter_key() { let mut ws = new_workspace();