Files
mini-redis/src/cmd/set.rs
2020-02-11 13:27:49 -08:00

48 lines
1.2 KiB
Rust

use crate::cmd::{Parse, ParseError};
use crate::{Connection, Frame, Kv};
use bytes::Bytes;
use std::io;
use std::time::Duration;
#[derive(Debug)]
pub struct Set {
key: String,
value: Bytes,
expire: Option<Duration>,
}
impl Set {
pub(crate) fn parse(parse: &mut Parse) -> Result<Set, ParseError> {
use ParseError::EndOfStream;
let key = parse.next_string()?;
let value = parse.next_bytes()?;
let mut expire = None;
match parse.next_string() {
Ok(s) if s == "EX" => {
let secs = parse.next_int()?;
expire = Some(Duration::from_secs(secs));
}
Ok(s) if s == "PX" => {
let ms = parse.next_int()?;
expire = Some(Duration::from_millis(ms));
}
Ok(_) => unimplemented!(),
Err(EndOfStream) => {}
Err(err) => return Err(err),
}
Ok(Set { key, value, expire })
}
pub(crate) async fn apply(self, kv: &Kv, dst: &mut Connection) -> io::Result<()> {
// Set the value
kv.set(self.key, self.value, self.expire);
let response = Frame::Simple("OK".to_string());
dst.write_frame(&response).await
}
}