Parsing frames.
This commit is contained in:
parent
6dc4c28bb5
commit
7ee1a91549
@ -12,3 +12,4 @@ tokio = { version = "1.16.1", features = ["full"] }
|
|||||||
dirs = "4.0.0"
|
dirs = "4.0.0"
|
||||||
serde_json = "1.0.79"
|
serde_json = "1.0.79"
|
||||||
serde = { version = "1.0.136", features= ["derive"] }
|
serde = { version = "1.0.136", features= ["derive"] }
|
||||||
|
bytes = "1.1.0"
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
mod command;
|
mod command;
|
||||||
|
mod mpv_framed;
|
||||||
mod mpvctl;
|
mod mpvctl;
|
||||||
|
|
||||||
pub use mpvctl::MpvCtl;
|
pub use mpvctl::MpvCtl;
|
||||||
|
58
src/mpvctl/mpv_framed.rs
Normal file
58
src/mpvctl/mpv_framed.rs
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
use bytes::{Buf, BytesMut};
|
||||||
|
use std::io::{self, Cursor};
|
||||||
|
use tokio::{io::AsyncReadExt, net::unix::OwnedReadHalf};
|
||||||
|
|
||||||
|
pub struct MpvFramed {
|
||||||
|
buffer: BytesMut,
|
||||||
|
socket_read: OwnedReadHalf,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MpvFramed {
|
||||||
|
pub fn new(socket_read: OwnedReadHalf) -> Self {
|
||||||
|
MpvFramed {
|
||||||
|
socket_read,
|
||||||
|
buffer: BytesMut::with_capacity(4 * 1024),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn read_frame(
|
||||||
|
&mut self,
|
||||||
|
) -> Result<Option<serde_json::Value>, Box<dyn std::error::Error>> {
|
||||||
|
//
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_frame(&mut self) -> Result<Option<serde_json::Value>, Box<dyn std::error::Error>> {
|
||||||
|
let mut cursor = Cursor::new(&self.buffer[..]);
|
||||||
|
if Self::has_frame(&mut cursor) {
|
||||||
|
let len = cursor.position() as usize;
|
||||||
|
cursor.set_position(0);
|
||||||
|
let frame: serde_json::Value = serde_json::from_slice(&cursor.get_ref()[0..len])?;
|
||||||
|
self.buffer.advance(len);
|
||||||
|
return Ok(Some(frame));
|
||||||
|
}
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn has_frame(cursor: &mut Cursor<&[u8]>) -> bool {
|
||||||
|
loop {
|
||||||
|
match Self::next_byte(cursor) {
|
||||||
|
Some(nb) if nb == b'\n' => {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Some(_) => (),
|
||||||
|
None => {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next_byte(cursor: &mut Cursor<&[u8]>) -> Option<u8> {
|
||||||
|
if !cursor.has_remaining() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(cursor.get_u8())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
use super::command::Command;
|
||||||
|
use bytes::BytesMut;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::os::unix::prelude::OsStrExt;
|
use std::os::unix::prelude::OsStrExt;
|
||||||
@ -7,8 +9,6 @@ use tokio::net::unix::OwnedWriteHalf;
|
|||||||
use tokio::net::UnixStream;
|
use tokio::net::UnixStream;
|
||||||
use tokio::sync::oneshot;
|
use tokio::sync::oneshot;
|
||||||
|
|
||||||
use super::command::Command;
|
|
||||||
|
|
||||||
pub struct MpvCtl {
|
pub struct MpvCtl {
|
||||||
socket: OwnedWriteHalf,
|
socket: OwnedWriteHalf,
|
||||||
next_request_id: u64,
|
next_request_id: u64,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user