summaryrefslogtreecommitdiffstats
path: root/src/render/mod.rs
blob: 1748137df4dad68e7bb3f6aabd3e772fdc47a61c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
mod cmd;
mod markdown;
mod repl;

use self::cmd::cmd_render_stream;
pub use self::markdown::{MarkdownRender, RenderOptions};
use self::repl::repl_render_stream;

use crate::client::Client;
use crate::config::SharedConfig;
use crate::print_now;
use crate::repl::{ReplyStreamHandler, SharedAbortSignal};

use anyhow::Result;
use crossbeam::channel::unbounded;
use crossbeam::sync::WaitGroup;
use std::thread::spawn;

pub fn render_stream(
    input: &str,
    client: &dyn Client,
    config: &SharedConfig,
    repl: bool,
    abort: SharedAbortSignal,
    wg: WaitGroup,
) -> Result<String> {
    let render_options = config.read().get_render_options()?;
    let mut stream_handler = {
        let (tx, rx) = unbounded();
        let abort_clone = abort.clone();
        spawn(move || {
            let run = move || {
                if repl {
                    let mut render = MarkdownRender::init(render_options)?;
                    repl_render_stream(&rx, &mut render, &abort)
                } else {
                    let mut render = MarkdownRender::init(render_options)?;
                    cmd_render_stream(&rx, &mut render, &abort)
                }
            };
            if let Err(err) = run() {
                let err = format!("{err:?}");
                print_now!("{}\n\n", err.trim());
            }
            drop(wg);
        });
        ReplyStreamHandler::new(tx, abort_clone)
    };
    client.send_message_streaming(input, &mut stream_handler)?;
    let buffer = stream_handler.get_buffer();
    Ok(buffer.to_string())
}