replace Connection::send_mut with internal mutability
This commit is contained in:
parent
7bc59f6df8
commit
4f1ef8aafb
|
@ -5,20 +5,17 @@ use servicepoint::{
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// make connection mut
|
let connection =
|
||||||
let mut connection =
|
|
||||||
Connection::open_websocket("ws://localhost:8080".parse().unwrap())
|
Connection::open_websocket("ws://localhost:8080".parse().unwrap())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// use send_mut instead of send
|
connection.send(Command::Clear).unwrap();
|
||||||
connection.send_mut(Command::Clear).unwrap();
|
|
||||||
|
|
||||||
let mut pixels = Bitmap::max_sized();
|
let mut pixels = Bitmap::max_sized();
|
||||||
pixels.fill(true);
|
pixels.fill(true);
|
||||||
|
|
||||||
// use send_mut instead of send
|
|
||||||
connection
|
connection
|
||||||
.send_mut(Command::BitmapLinearWin(
|
.send(Command::BitmapLinearWin(
|
||||||
Origin::ZERO,
|
Origin::ZERO,
|
||||||
pixels,
|
pixels,
|
||||||
CompressionCode::Lzma,
|
CompressionCode::Lzma,
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
use crate::packet::Packet;
|
use crate::packet::Packet;
|
||||||
|
|
||||||
/// A connection to the display.
|
/// A connection to the display.
|
||||||
|
@ -35,20 +34,13 @@ pub enum Connection {
|
||||||
/// [servicepoint-websocket-relay]: https://github.com/kaesaecracker/servicepoint-websocket-relay
|
/// [servicepoint-websocket-relay]: https://github.com/kaesaecracker/servicepoint-websocket-relay
|
||||||
#[cfg(feature = "protocol_websocket")]
|
#[cfg(feature = "protocol_websocket")]
|
||||||
WebSocket(
|
WebSocket(
|
||||||
tungstenite::WebSocket<
|
std::sync::Arc<std::sync::Mutex<tungstenite::WebSocket<
|
||||||
tungstenite::stream::MaybeTlsStream<std::net::TcpStream>,
|
tungstenite::stream::MaybeTlsStream<std::net::TcpStream>,
|
||||||
>,
|
>>>,
|
||||||
),
|
),
|
||||||
|
|
||||||
/// A fake connection for testing that does not actually send anything.
|
/// A fake connection for testing that does not actually send anything.
|
||||||
///
|
|
||||||
/// This variant allows immutable send.
|
|
||||||
Fake,
|
Fake,
|
||||||
|
|
||||||
/// A fake connection for testing that does not actually send anything.
|
|
||||||
///
|
|
||||||
/// This variant does not allow immutable send.
|
|
||||||
FakeMutableSend,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -96,7 +88,7 @@ impl Connection {
|
||||||
/// let uri = "ws://localhost:8080".parse().unwrap();
|
/// let uri = "ws://localhost:8080".parse().unwrap();
|
||||||
/// let mut connection = Connection::open_websocket(uri)
|
/// let mut connection = Connection::open_websocket(uri)
|
||||||
/// .expect("could not connect");
|
/// .expect("could not connect");
|
||||||
/// connection.send_mut(Command::Clear)
|
/// connection.send(Command::Clear)
|
||||||
/// .expect("send failed");
|
/// .expect("send failed");
|
||||||
/// ```
|
/// ```
|
||||||
#[cfg(feature = "protocol_websocket")]
|
#[cfg(feature = "protocol_websocket")]
|
||||||
|
@ -111,25 +103,17 @@ impl Connection {
|
||||||
|
|
||||||
let request = ClientRequestBuilder::new(uri).into_client_request()?;
|
let request = ClientRequestBuilder::new(uri).into_client_request()?;
|
||||||
let (sock, _) = connect(request)?;
|
let (sock, _) = connect(request)?;
|
||||||
Ok(Self::WebSocket(sock))
|
Ok(Self::WebSocket(std::sync::Arc::new(std::sync::Mutex::new(sock))))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Send something packet-like to the display. Usually this is in the form of a Command.
|
/// Send something packet-like to the display. Usually this is in the form of a Command.
|
||||||
///
|
///
|
||||||
/// This variant can only be used for connections that support immutable send, e.g. [Connection::Udp].
|
|
||||||
///
|
|
||||||
/// If you want to be able to switch the protocol, you should use [Self::send_mut] instead.
|
|
||||||
///
|
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// - `packet`: the packet-like to send
|
/// - `packet`: the packet-like to send
|
||||||
///
|
///
|
||||||
/// returns: true if packet was sent, otherwise false
|
/// returns: true if packet was sent, otherwise false
|
||||||
///
|
///
|
||||||
/// # Panics
|
|
||||||
///
|
|
||||||
/// If the connection does not support immutable send, e.g. for [Connection::WebSocket].
|
|
||||||
///
|
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
|
@ -150,6 +134,13 @@ impl Connection {
|
||||||
.map_err(SendError::IoError)
|
.map_err(SendError::IoError)
|
||||||
.map(move |_| ()) // ignore Ok value
|
.map(move |_| ()) // ignore Ok value
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "protocol_websocket")]
|
||||||
|
Connection::WebSocket(socket) => {
|
||||||
|
let mut socket = socket.lock().unwrap();
|
||||||
|
socket
|
||||||
|
.send(tungstenite::Message::Binary(data))
|
||||||
|
.map_err(SendError::WebsocketError)
|
||||||
|
}
|
||||||
Connection::Fake => {
|
Connection::Fake => {
|
||||||
let _ = data;
|
let _ = data;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -160,58 +151,13 @@ impl Connection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Send something packet-like to the display. Usually this is in the form of a Command.
|
|
||||||
///
|
|
||||||
/// This variant has to be used for connections that do not support immutable send, e.g. [Connection::WebSocket].
|
|
||||||
///
|
|
||||||
/// If you want to be able to switch the protocol, you should use this variant.
|
|
||||||
///
|
|
||||||
/// # Arguments
|
|
||||||
///
|
|
||||||
/// - `packet`: the packet-like to send
|
|
||||||
///
|
|
||||||
/// returns: true if packet was sent, otherwise false
|
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```rust
|
|
||||||
/// let mut connection = servicepoint::Connection::FakeMutableSend;
|
|
||||||
/// // turn off all pixels on display
|
|
||||||
/// connection.send_mut(servicepoint::Command::Clear)
|
|
||||||
/// .expect("send failed");
|
|
||||||
/// ```
|
|
||||||
pub fn send_mut(
|
|
||||||
&mut self,
|
|
||||||
packet: impl Into<Packet>,
|
|
||||||
) -> Result<(), SendError> {
|
|
||||||
match self {
|
|
||||||
#[cfg(feature = "protocol_websocket")]
|
|
||||||
Connection::WebSocket(socket) => {
|
|
||||||
let packet = packet.into();
|
|
||||||
log::debug!("sending {packet:?}");
|
|
||||||
let data: Vec<u8> = packet.into();
|
|
||||||
socket
|
|
||||||
.send(tungstenite::Message::Binary(data))
|
|
||||||
.map_err(SendError::WebsocketError)
|
|
||||||
}
|
|
||||||
Connection::FakeMutableSend => {
|
|
||||||
let packet = packet.into();
|
|
||||||
log::debug!("sending {packet:?}");
|
|
||||||
let data: Vec<u8> = packet.into();
|
|
||||||
let _ = data;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
_ => self.send(packet),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Connection {
|
impl Drop for Connection {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
#[cfg(feature = "protocol_websocket")]
|
#[cfg(feature = "protocol_websocket")]
|
||||||
if let Connection::WebSocket(sock) = self {
|
if let Connection::WebSocket(sock) = self {
|
||||||
_ = sock.close(None);
|
_ = sock.try_lock().map(move |mut sock| sock.close(None).unwrap() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -227,19 +173,4 @@ mod tests {
|
||||||
let packet = Packet::try_from(data).unwrap();
|
let packet = Packet::try_from(data).unwrap();
|
||||||
Connection::Fake.send(packet).unwrap()
|
Connection::Fake.send(packet).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn send_fake_mutable() {
|
|
||||||
let data: &[u8] = &[0u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
||||||
let packet = Packet::try_from(data).unwrap();
|
|
||||||
Connection::FakeMutableSend.send_mut(packet).unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[should_panic]
|
|
||||||
fn send_fake_mutable_panic() {
|
|
||||||
let data: &[u8] = &[0u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
||||||
let packet = Packet::try_from(data).unwrap();
|
|
||||||
Connection::FakeMutableSend.send(packet).unwrap()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue