use std::io::{
Write,
Result as IoResult
};
use std::ops::{
Deref,
DerefMut
};
use crate::Buffer;
use crate::term::EmitEscapes;
use super::Spinner;
pub struct Line<'s> {
buffer: Option<Buffer>,
spinner: &'s Spinner<'s>
}
pub struct NoNewLine<'s> {
buffer: Option<Buffer>,
spinner: &'s Spinner<'s>
}
pub struct Message<'s> {
buffer: Option<Buffer>,
spinner: &'s Spinner<'s>
}
impl<'s> Line<'s> {
pub(crate) fn new(spinner: &'s Spinner) -> Self {
let buffer = Some(spinner.claw.out.buffer());
Self {buffer, spinner}
}
pub fn print(self) {}
pub fn discard(mut self) {self.buffer.take();}
pub fn no_newline(mut self) -> NoNewLine<'s> {
let buffer = self.buffer.take().unwrap();
NoNewLine {spinner: self.spinner, buffer: Some(buffer)}
}
}
impl<'s> Drop for Line<'s> {
fn drop(&mut self) {
if let Some(mut buffer) = self.buffer.take() {
writeln!(buffer, ).unwrap();
self.spinner.print_buffer(buffer);
}
}
}
impl<'s> Deref for Line<'s> {
type Target = Buffer;
fn deref(&self) -> &Self::Target {self.buffer.as_ref().unwrap()}
}
impl<'s> DerefMut for Line<'s> {
fn deref_mut(&mut self) -> &mut Self::Target {self.buffer.as_mut().unwrap()}
}
impl<'s> Write for Line<'s> {
fn write(&mut self, buf: &[u8]) -> IoResult<usize> {
self.deref_mut().write(buf)
}
fn flush(&mut self) -> IoResult<()> {
self.deref_mut().flush()
}
}
impl<'s> EmitEscapes for Line<'s> {
fn escapes_recognized(&self) -> bool {
self.buffer.as_ref().unwrap().escapes_recognized()
}
}
impl<'s> NoNewLine<'s> {
pub fn print(self) {}
pub fn discard(mut self) {self.buffer.take();}
}
impl<'s> Drop for NoNewLine<'s> {
fn drop(&mut self) {
if let Some(buffer) = self.buffer.take() {
self.spinner.print_buffer(buffer);
}
}
}
impl<'s> Deref for NoNewLine<'s> {
type Target = Buffer;
fn deref(&self) -> &Self::Target {self.buffer.as_ref().unwrap()}
}
impl<'s> DerefMut for NoNewLine<'s> {
fn deref_mut(&mut self) -> &mut Self::Target {self.buffer.as_mut().unwrap()}
}
impl<'s> Message<'s> {
pub(crate) fn new(spinner: &'s Spinner) -> Self {
let buffer = Some(spinner.claw.err.buffer());
Self {buffer, spinner}
}
pub fn set(self) {}
pub fn discard(mut self) {self.buffer.take();}
}
impl<'s> Drop for Message<'s> {
fn drop(&mut self) {
if let Some(buffer) = self.buffer.take() {
self.spinner.set_message(buffer);
}
}
}
impl<'s> Deref for Message<'s> {
type Target = Buffer;
fn deref(&self) -> &Self::Target {self.buffer.as_ref().unwrap()}
}
impl<'s> DerefMut for Message<'s> {
fn deref_mut(&mut self) -> &mut Self::Target {self.buffer.as_mut().unwrap()}
}
impl<'s> Write for Message<'s> {
fn write(&mut self, buf: &[u8]) -> IoResult<usize> {
self.deref_mut().write(buf)
}
fn flush(&mut self) -> IoResult<()> {
self.deref_mut().flush()
}
}
impl<'s> EmitEscapes for Message<'s> {
fn escapes_recognized(&self) -> bool {
self.buffer.as_ref().unwrap().escapes_recognized()
}
}