# ember-protocol
RESP3 wire protocol implementation for [ember](https://github.com/kacy/ember). handles zero-copy parsing, direct-to-buffer serialization, and typed command dispatch.
## what's in here
- **parse** — zero-copy RESP3 frame parser that works directly on byte slices, returning `(Frame, bytes_consumed)` for pipelining support
- **serialize** — writes frames directly into `BytesMut` with no intermediate allocations
- **command** — converts raw frames into typed `Command` enums with argument validation, arity checks, and flag parsing
- **types** — `Frame` enum: `Simple`, `Error`, `Integer`, `Bulk`, `Null`, `Array`, `Map`
## quick start
```rust
use bytes::{Bytes, BytesMut};
use ember_protocol::{Frame, parse_frame, Command};
// parse a RESP3 frame from raw bytes
let input = b"+OK\r\n";
let (frame, consumed) = parse_frame(input).unwrap().unwrap();
assert_eq!(frame, Frame::Simple("OK".into()));
// serialize a frame back to bytes
let mut buf = BytesMut::new();
frame.serialize(&mut buf);
assert_eq!(&buf[..], b"+OK\r\n");
// parse a command from an array frame
let frame = Frame::Array(vec![
Frame::Bulk(Bytes::from("SET")),
Frame::Bulk(Bytes::from("key")),
Frame::Bulk(Bytes::from("value")),
]);
let cmd = Command::from_frame(frame).unwrap();
```
## supported commands
**strings**: `GET`, `SET` (with NX/XX/EX/PX), `INCR`, `DECR`, `INCRBY`, `DECRBY`, `INCRBYFLOAT`, `APPEND`, `STRLEN`, `MGET`, `MSET`, `COPY`
**lists**: `LPUSH`, `RPUSH`, `LPOP`, `RPOP`, `LRANGE`, `LLEN`, `BLPOP`, `BRPOP`
**sorted sets**: `ZADD` (with NX/XX/GT/LT/CH flags), `ZREM`, `ZSCORE`, `ZRANK`, `ZRANGE` (with WITHSCORES), `ZCARD`, `ZSCAN`
**hashes**: `HSET`, `HGET`, `HGETALL`, `HDEL`, `HEXISTS`, `HLEN`, `HINCRBY`, `HKEYS`, `HVALS`, `HMGET`, `HSCAN`
**sets**: `SADD`, `SREM`, `SMEMBERS`, `SISMEMBER`, `SCARD`, `SSCAN`
**keys**: `DEL`, `UNLINK`, `EXISTS`, `EXPIRE`, `PEXPIRE`, `TTL`, `PTTL`, `PERSIST`, `TYPE`, `RENAME`, `SCAN`, `KEYS`, `OBJECT ENCODING`, `OBJECT REFCOUNT`
**server**: `PING`, `ECHO`, `DBSIZE`, `INFO`, `BGSAVE`, `BGREWRITEAOF`, `FLUSHDB`, `AUTH`, `QUIT`, `MONITOR`, `CONFIG GET`, `CONFIG SET`, `CONFIG REWRITE`, `SLOWLOG GET`, `SLOWLOG LEN`, `SLOWLOG RESET`, `CLIENT ID`, `CLIENT SETNAME`, `CLIENT GETNAME`, `CLIENT LIST`, `TIME`, `LASTSAVE`, `ROLE`
**transactions**: `MULTI`, `EXEC`, `DISCARD`, `WATCH`, `UNWATCH`
**pub/sub**: `SUBSCRIBE`, `UNSUBSCRIBE`, `PSUBSCRIBE`, `PUNSUBSCRIBE`, `PUBLISH`, `PUBSUB CHANNELS`, `PUBSUB NUMSUB`, `PUBSUB NUMPAT`
**acl**: `ACL WHOAMI`, `ACL LIST`, `ACL USERS`, `ACL GETUSER`, `ACL DELUSER`, `ACL SETUSER`, `ACL CAT`
**cluster**: `CLUSTER INFO`, `NODES`, `SLOTS`, `KEYSLOT`, `MYID`, `MEET`, `ADDSLOTS`, `ADDSLOTSRANGE`, `DELSLOTS`, `SETSLOT`, `FORGET`, `REPLICATE`, `FAILOVER`, `COUNTKEYSINSLOT`, `GETKEYSINSLOT`, `MIGRATE`, `RESTORE`, `ASKING`
## related crates
| [emberkv-core](../ember-core) | storage engine, keyspace, sharding |
| [ember-persistence](../ember-persistence) | AOF, snapshots, and crash recovery |
| [ember-server](../ember-server) | TCP server and connection handling |
| [ember-cluster](../ember-cluster) | distributed coordination |
| [ember-cli](../ember-cli) | interactive CLI client (REPL, cluster subcommands, benchmark) |