use std::path::PathBuf;
use tectonic_status_base::StatusBackend;
use super::{InputHandle, IoProvider, OpenResult, OutputHandle};
pub struct IoStack<'a> {
items: Vec<&'a mut dyn IoProvider>,
}
impl<'a> IoStack<'a> {
pub fn new(items: Vec<&'a mut dyn IoProvider>) -> IoStack<'a> {
IoStack { items }
}
}
impl<'a> IoProvider for IoStack<'a> {
fn output_open_name(&mut self, name: &str) -> OpenResult<OutputHandle> {
for item in &mut self.items {
let r = item.output_open_name(name);
match r {
OpenResult::NotAvailable => continue,
_ => return r,
};
}
OpenResult::NotAvailable
}
fn output_open_stdout(&mut self) -> OpenResult<OutputHandle> {
for item in &mut self.items {
let r = item.output_open_stdout();
match r {
OpenResult::NotAvailable => continue,
_ => return r,
};
}
OpenResult::NotAvailable
}
fn input_open_name(
&mut self,
name: &str,
status: &mut dyn StatusBackend,
) -> OpenResult<InputHandle> {
for item in &mut self.items {
let r = item.input_open_name(name, status);
match r {
OpenResult::NotAvailable => continue,
_ => return r,
};
}
OpenResult::NotAvailable
}
fn input_open_name_with_abspath(
&mut self,
name: &str,
status: &mut dyn StatusBackend,
) -> OpenResult<(InputHandle, Option<PathBuf>)> {
for item in &mut self.items {
let r = item.input_open_name_with_abspath(name, status);
match r {
OpenResult::NotAvailable => continue,
_ => return r,
};
}
OpenResult::NotAvailable
}
fn input_open_primary(&mut self, status: &mut dyn StatusBackend) -> OpenResult<InputHandle> {
for item in &mut self.items {
let r = item.input_open_primary(status);
match r {
OpenResult::NotAvailable => continue,
_ => return r,
};
}
OpenResult::NotAvailable
}
fn input_open_primary_with_abspath(
&mut self,
status: &mut dyn StatusBackend,
) -> OpenResult<(InputHandle, Option<PathBuf>)> {
for item in &mut self.items {
let r = item.input_open_primary_with_abspath(status);
match r {
OpenResult::NotAvailable => continue,
_ => return r,
};
}
OpenResult::NotAvailable
}
fn input_open_format(
&mut self,
name: &str,
status: &mut dyn StatusBackend,
) -> OpenResult<InputHandle> {
for item in &mut self.items {
let r = item.input_open_format(name, status);
match r {
OpenResult::NotAvailable => continue,
_ => return r,
};
}
OpenResult::NotAvailable
}
}