use std::{ffi::OsString, io::Result};
use super::{
util::{FunctionDir, Status},
Function, Handle,
};
#[derive(Debug, Clone, Default)]
#[non_exhaustive]
pub struct MidiBuilder {
pub buflen: Option<u16>,
pub id: Option<String>,
pub in_ports: Option<u8>,
pub out_ports: Option<u8>,
pub index: Option<u8>,
pub qlen: Option<u8>,
}
impl MidiBuilder {
pub fn build(self) -> (Midi, Handle) {
let dir = FunctionDir::new();
(Midi { dir: dir.clone() }, Handle::new(MidiFunction { builder: self, dir }))
}
}
#[derive(Debug)]
struct MidiFunction {
builder: MidiBuilder,
dir: FunctionDir,
}
impl Function for MidiFunction {
fn driver(&self) -> OsString {
"midi".into()
}
fn dir(&self) -> FunctionDir {
self.dir.clone()
}
fn register(&self) -> Result<()> {
if let Some(buflen) = self.builder.buflen {
self.dir.write("buflen", buflen.to_string())?;
}
if let Some(id) = &self.builder.id {
self.dir.write("id", id)?;
}
if let Some(in_ports) = self.builder.in_ports {
self.dir.write("in_ports", in_ports.to_string())?;
}
if let Some(out_ports) = self.builder.out_ports {
self.dir.write("out_ports", out_ports.to_string())?;
}
if let Some(index) = self.builder.index {
self.dir.write("index", index.to_string())?;
}
if let Some(qlen) = self.builder.qlen {
self.dir.write("qlen", qlen.to_string())?;
}
Ok(())
}
}
#[derive(Debug)]
pub struct Midi {
dir: FunctionDir,
}
impl Midi {
pub fn builder() -> MidiBuilder {
MidiBuilder::default()
}
pub fn status(&self) -> Status {
self.dir.status()
}
}