use bollard::query_parameters::LogsOptions;
use futures_util::TryStreamExt;
use crate::{
commands::{container::shared::Error as ConnectionError, global},
print,
};
use super::shared::{Args, Name};
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error(transparent)]
ConnectionError(#[from] ConnectionError),
#[error("⛔ ️Failed to tail container: {0}")]
TailContainerError(#[from] bollard::errors::Error),
}
#[derive(Debug, clap::Parser, Clone)]
pub struct Cmd {
#[command(flatten)]
pub container_args: Args,
#[arg(default_value = "local")]
pub name: String,
}
impl Cmd {
pub async fn run(&self, global_args: &global::Args) -> Result<(), Error> {
let print = print::Print::new(global_args.quiet);
let container_name = Name(self.name.clone()).get_internal_container_name();
let docker = self.container_args.connect_to_docker(&print).await?;
let logs_stream = &mut docker.logs(
&container_name,
Some(LogsOptions {
follow: true,
stdout: true,
stderr: true,
tail: "all".to_owned(),
..Default::default()
}),
);
while let Some(log) = logs_stream.try_next().await? {
print!("{log}");
}
Ok(())
}
}