From ca1851a21479f9df05b3fe8d4de43c13666029f8 Mon Sep 17 00:00:00 2001 From: Alexander Baranov Date: Wed, 25 Feb 2026 22:10:19 +0300 Subject: [PATCH] homework: reduce panics --- smart-house/src/bin/power_socket_client.rs | 5 +++-- smart-house/src/power_socket.rs | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/smart-house/src/bin/power_socket_client.rs b/smart-house/src/bin/power_socket_client.rs index 1720a88..9062b33 100644 --- a/smart-house/src/bin/power_socket_client.rs +++ b/smart-house/src/bin/power_socket_client.rs @@ -1,10 +1,11 @@ use smart_house::PowerSocket; use std::time::Duration; -fn main() { - let mut power_socket = PowerSocket::connect("127.0.0.1:10001"); +fn main() -> Result<(), Box> { + let mut power_socket = PowerSocket::connect("127.0.0.1:10001")?; println!("{}", power_socket.display()); std::thread::sleep(Duration::from_secs(2)); power_socket.set_on(!power_socket.is_on()); println!("{}", power_socket.display()); + Ok(()) } diff --git a/smart-house/src/power_socket.rs b/smart-house/src/power_socket.rs index 30cd075..3a4dd4e 100644 --- a/smart-house/src/power_socket.rs +++ b/smart-house/src/power_socket.rs @@ -1,5 +1,6 @@ use std::cell::RefCell; use std::fmt::{Debug, Display}; +use std::io; use std::io::{Read, Write}; use std::net::{SocketAddr, TcpStream}; use std::time::Duration; @@ -16,10 +17,9 @@ impl PowerSocket { } } - pub fn connect(addr: &str) -> Self { - Self { - handle: Box::new(PowerSocketClient::new(addr)), - } + pub fn connect(addr: &str) -> Result { + let handle = PowerSocketClient::new(addr)?; + Ok(Self { handle: Box::new(handle) }) } pub fn is_on(&self) -> bool { @@ -82,12 +82,12 @@ struct PowerSocketClient { } impl PowerSocketClient { - pub fn new(addr: &str) -> Self { - let addr: SocketAddr = addr.parse().expect("addr should be valid tcp address"); - let stream = TcpStream::connect_timeout(&addr, TIMEOUT).expect("address should be available to connect"); - stream.set_write_timeout(Some(TIMEOUT)).expect("write timeout should be set"); - stream.set_read_timeout(Some(TIMEOUT)).expect("read timeout should be set"); - Self { stream: RefCell::new(stream) } + fn new(addr: &str) -> Result { + let addr: SocketAddr = addr.parse().map_err(io::Error::other)?; + let stream = TcpStream::connect_timeout(&addr, TIMEOUT)?; + stream.set_write_timeout(Some(TIMEOUT))?; + stream.set_read_timeout(Some(TIMEOUT))?; + Ok(Self { stream: RefCell::new(stream) }) } }