blob: 595462331809daa609d60d5445b129c3eb50f980 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use {
crate::terminal_view::TerminalViewAssistant,
anyhow::Error,
carnelian::{AppAssistant, AppSender, ViewAssistantPtr, ViewKey},
std::ffi::CString,
};
const TERMINAL_ENVIRON: &[&str; 1] = &["TERM=xterm-256color"];
const TERMINAL_SCROLL_TO_BOTTOM_ON_INPUT: bool = true;
pub struct TerminalAssistant {
app_sender: AppSender,
cmd: Vec<CString>,
}
impl TerminalAssistant {
pub fn new(app_sender: &AppSender, cmd: Vec<CString>) -> TerminalAssistant {
TerminalAssistant { app_sender: app_sender.clone(), cmd }
}
#[cfg(test)]
fn new_for_test() -> TerminalAssistant {
let app_sender = AppSender::new_for_testing_purposes_only();
Self::new(&app_sender, vec![])
}
}
impl AppAssistant for TerminalAssistant {
fn setup(&mut self) -> Result<(), Error> {
Ok(())
}
fn create_view_assistant(&mut self, view_key: ViewKey) -> Result<ViewAssistantPtr, Error> {
let environ =
TERMINAL_ENVIRON.iter().map(|s| CString::new(*s).unwrap()).collect::<Vec<_>>();
Ok(Box::new(TerminalViewAssistant::new(
&self.app_sender,
view_key,
TERMINAL_SCROLL_TO_BOTTOM_ON_INPUT,
self.cmd.clone(),
environ,
)))
}
}
#[cfg(test)]
mod tests {
use super::*;
use fuchsia_async as fasync;
#[fasync::run_singlethreaded(test)]
async fn creates_terminal_view() -> Result<(), Error> {
let mut app = TerminalAssistant::new_for_test();
app.create_view_assistant(Default::default())?;
Ok(())
}
}