use crate::channel::SocketCanChannel;
use crate::error::SocketCanError;
enum InterfaceSpec {
Index(u32),
Name(String),
}
pub struct SocketCanDriver;
impl SocketCanDriver {
#[must_use]
pub const fn new() -> Self {
Self
}
#[must_use]
pub fn channel_by_name(&self, name: &str) -> SocketCanChannelBuilder {
SocketCanChannelBuilder {
interface: InterfaceSpec::Name(name.to_string()),
}
}
#[must_use]
pub const fn channel(&self, index: u32) -> SocketCanChannelBuilder {
SocketCanChannelBuilder {
interface: InterfaceSpec::Index(index),
}
}
}
impl Default for SocketCanDriver {
fn default() -> Self {
Self::new()
}
}
pub struct SocketCanChannelBuilder {
interface: InterfaceSpec,
}
impl SocketCanChannelBuilder {
pub fn connect(self) -> Result<SocketCanChannel, SocketCanError> {
match self.interface {
InterfaceSpec::Index(idx) => SocketCanChannel::open_iface(idx),
InterfaceSpec::Name(ref name) => SocketCanChannel::open(name),
}
}
}