diff --git a/src/action.rs b/src/action.rs index 22df307..223ddc7 100644 --- a/src/action.rs +++ b/src/action.rs @@ -1,3 +1,4 @@ +use crate::mode::Mode; use std::{fmt, string::ToString}; use serde::{ @@ -16,7 +17,12 @@ pub enum Action { Quit, Refresh, Error(String), + NextTable, + Mode(Mode), + NextMode(Mode), + PreviousMode(Mode), Help, + Pool, DagRun, Code, Clear, diff --git a/src/app.rs b/src/app.rs index 5b8fe97..acb44a3 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,6 +1,12 @@ +use crate::components::table::table::LinkedTable; +use crate::components::table::table::Tables; +use crate::models::model_airflow::ModelView; +use crossterm::event::KeyCode::Char; use std::cell::RefCell; +use std::ops::Deref; use std::rc::Rc; +use crate::components::table::pool::Pool; use crate::main_layout::{self, Chunk}; use crate::mode::ObservableMode; use color_eyre::eyre::Result; @@ -10,7 +16,9 @@ use ratatui::layout::{Constraint, Direction, Layout}; use ratatui::prelude::Rect; use reqwest::Client; use serde::{Deserialize, Serialize}; +use std::sync::Arc; use tokio::sync::mpsc; +use tokio::sync::Mutex; use tokio::time::Instant; use crate::components::ascii::Ascii; @@ -19,10 +27,15 @@ use crate::components::command_search::CommandSearch; use crate::components::context_informations::ContextInformation; use crate::components::shortcut::Shortcut; use crate::components::status_bar::StatusBar; -use crate::components::table_dag_runs::TableDagRuns; +use crate::components::table::dag_run::DagRun as TableDagRun; +use crate::components::table::main::MainTable; +use crate::components::LinkedComponent; +use crate::context_data::ContextData; use crate::main_layout::MainLayout; +use crate::mode::Mode::Search; use crate::models::dag_run::DagRun; use crate::models::dag_runs::DagRuns; +use crate::models::pool::PoolCollection; use crate::{ action::Action, components::{fps::FpsCounter, Component}, @@ -42,15 +55,11 @@ pub struct App { pub last_tick_key_events: Vec, pub last_dag_runs_call: Instant, pub last_task_call: Option, - pub dag_runs: DagRuns, + pub context_data: Arc>, + pub context_data_bis: ContextData, client: Client, - context_information: ContextInformation, - shortcut: Shortcut, - ascii: Ascii, - table_dag_runs: TableDagRuns, - status_bar: StatusBar, - command_search: CommandSearch, - command: Command, + linked_components: LinkedComponent, + tables: Tables, } impl App { @@ -59,6 +68,29 @@ impl App { let config = Config::new()?; let mode = Mode::DagRun; let client = Client::new(); + + let mut linked_components = LinkedComponent::new(); + linked_components.append( + Rc::new(RefCell::new(ContextInformation::new())), + Chunk::Context(0), + None, + ); + linked_components.append(Rc::new(RefCell::new(Ascii::new())), Chunk::Context(2), None); + linked_components.append( + Rc::new(RefCell::new(Command::new())), + Chunk::CommandChunk, + Some(Mode::Command), + ); + linked_components.append( + Rc::new(RefCell::new(CommandSearch::new())), + Chunk::CommandChunk, + Some(Mode::Search), + ); + linked_components.append(Rc::new(RefCell::new(MainTable::new())), Chunk::Table, None); + linked_components.append(Rc::new(RefCell::new(StatusBar::new())), Chunk::Status, None); + + let mut tables = Tables::new(); + Ok(Self { tick_rate, frame_rate, @@ -70,157 +102,103 @@ impl App { last_tick_key_events: Vec::new(), last_dag_runs_call: Instant::now(), last_task_call: None, - dag_runs: DagRuns::new(), + context_data: Arc::new(tokio::sync::Mutex::new(ContextData::new())), + context_data_bis: ContextData::new(), client, - context_information: ContextInformation::new(), - shortcut: Shortcut::new(), - ascii: Ascii::new(), - table_dag_runs: TableDagRuns::new(), - status_bar: StatusBar::new(), - command_search: CommandSearch::new(), - command: Command::new(), + linked_components, + tables, }) } pub async fn run(&mut self) -> Result<()> { let (action_tx, mut action_rx) = mpsc::unbounded_channel(); - self.dag_runs - .set_dag_runs( - &self.client, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - ) - .await?; - self.last_dag_runs_call = Instant::now(); - // Set the initial dag_runs state for the table widget - self.table_dag_runs.set_dag_runs(self.dag_runs.clone()); + let (mut data_tx, mut data_rx) = mpsc::unbounded_channel::>(); let mut tui = tui::Tui::new()?; // tui.mouse(true); tui.enter()?; - // Register action and config handlers for all components - self.context_information - .register_action_handler(action_tx.clone())?; - self.context_information - .register_config_handler(self.config.clone())?; - - self.shortcut.register_action_handler(action_tx.clone())?; - self.shortcut.register_config_handler(self.config.clone())?; - - self.ascii.register_action_handler(action_tx.clone())?; - self.ascii.register_config_handler(self.config.clone())?; - - self.table_dag_runs - .register_action_handler(action_tx.clone())?; - self.table_dag_runs - .register_config_handler(self.config.clone())?; - - // Init the area for all components - self.context_information.init(tui.size()?)?; - self.shortcut.init(tui.size()?)?; - self.ascii.init(tui.size()?)?; - self.table_dag_runs.init(tui.size()?)?; + let context_data_ref = Arc::clone(&self.context_data); + let airflow_config = self.config.airflow.clone(); + let mode = self.observable_mode.get().clone(); + tokio::spawn(async move { + let mut lock = context_data_ref.lock().await; + lock.refresh(mode).await; + }); + // Set tui_size for the main_layout self.main_layout .borrow_mut() .set_tui_size(Rc::new(RefCell::new(tui.size().unwrap()))); + + // Set the default main layout self.main_layout .borrow_mut() .set_main_layout(&self.observable_mode.get()); + // Register the main layout refresh function for the observable mode let main_layout_rc = Rc::clone(&self.main_layout); self.observable_mode .set_refresh_layout_fn(move |mode| main_layout_rc.borrow_mut().set_main_layout(&mode)); - loop { - if self.last_dag_runs_call.elapsed().as_secs() == 3 { - self.dag_runs - .set_dag_runs( - &self.client, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - ) - .await?; - self.last_dag_runs_call = Instant::now(); - self.table_dag_runs.set_dag_runs(self.dag_runs.clone()); - } + // Register configs for components + self.linked_components + .register_config_components(&self.config); - // If the task mode is selected, then fetch the tasks for the selected dag_run - if self.observable_mode.get() == Mode::Task { - if let Some(last_task_call) = self.last_task_call { - if last_task_call.elapsed().as_secs() >= 2 { - self.table_dag_runs.tasks = Some( - self.dag_runs - .get_task( - &self.client, - &self.config.airflow, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - self.table_dag_runs.table_state.selected().unwrap_or(0), - ) - .await?, - ); - self.last_task_call = Some(Instant::now()); - } - } else { - self.last_task_call = Some(Instant::now()); - } - } + // Register action handlers for components + self.linked_components + .register_action_components(&action_tx); + + // Register airflow config for context_data + let context_data_ref = Arc::clone(&self.context_data); + let airflow_config = self.config.airflow.clone(); + tokio::spawn(async move { + let mut lock = context_data_ref.lock().await; + lock.handle_airflow_config(airflow_config); + }); + + let context_data_ref = Arc::clone(&self.context_data); + let airflow_config = self.config.airflow.clone(); + let mode = self.observable_mode.get().clone(); + tokio::spawn(async move { + let mut lock = context_data_ref.lock().await; + lock.refresh(mode).await; + }); + + self.context_data_bis + .handle_airflow_config(self.config.airflow.clone()); + + loop { if let Some(e) = tui.next().await { match e { tui::Event::Quit => action_tx.send(Action::Quit)?, tui::Event::Tick => action_tx.send(Action::Tick)?, tui::Event::Render => action_tx.send(Action::Render)?, tui::Event::Resize(x, y) => action_tx.send(Action::Resize(x, y))?, - tui::Event::Key(key) => { - if let Some(keymap) = - self.config.keybindings.get(&self.observable_mode.get()) - { - if let Some(action) = keymap.get(&vec![key]) { - log::info!("Got action: {action:?}"); - action_tx.send(action.clone())?; - } else { - // If the key was not handled as a single key action, - // then consider it for multi-key combinations. - self.last_tick_key_events.push(key); - - // Check for multi-key combinations - if let Some(action) = keymap.get(&self.last_tick_key_events) { - log::info!("Got action: {action:?}"); - action_tx.send(action.clone())?; - } - } - }; + tui::Event::Key(key) => match key.code { + Char('q') => self.should_quit = true, + _ => {} + }, + tui::Event::Refresh => { + let test = self.context_data_bis.refresh(mode).await.unwrap(); + data_tx.send(test); } _ => {} } - if let Some(action) = self.context_information.handle_events(Some(e.clone()))? { - action_tx.send(action)?; - } - if let Some(action) = self.shortcut.handle_events(Some(e.clone()))? { - action_tx.send(action)?; - } - if let Some(action) = self.ascii.handle_events(Some(e.clone()))? { - action_tx.send(action)?; - } - if let Some(action) = self.command_search.handle_events(Some(e.clone()))? { - action_tx.send(action)?; - } - if let Some(action) = self.command.handle_events(Some(e.clone()))? { - action_tx.send(action)?; - } - if let Some(action) = self.table_dag_runs.handle_events(Some(e.clone()))? { - action_tx.send(action)?; + + let context_data_ref = Arc::clone(&self.context_data); + let mut lock = context_data_ref.lock().await; + match self.linked_components.handle_events( + Some(&e), + &mut lock, + &self.observable_mode, + &mut self.tables, + )? { + Some(action) => action_tx.send(action)?, + None => {} } } while let Ok(action) = action_rx.try_recv() { - if action != Action::Tick && action != Action::Render { - log::debug!("{action:?}"); - } match action { Action::Tick => { self.last_tick_key_events.drain(..); @@ -229,299 +207,73 @@ impl App { Action::Suspend => self.should_suspend = true, Action::Resume => self.should_suspend = false, Action::Resize(w, h) => { - tui.resize(Rect::new(0, 0, w, h))?; + let context_data_ref = Arc::clone(&self.context_data); + let context_data_lock = context_data_ref.lock().await; + let table_ref = Arc::clone( + &self + .tables + .get_table_by_mode(self.observable_mode.get()) + .unwrap(), + ); + let table = table_ref.lock().await; tui.draw(|f| { - let r = self.context_information.draw(f, f.size()); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - - let r = self.shortcut.draw(f, f.size()); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - - let r = self.ascii.draw(f, f.size()); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - - let r = self.table_dag_runs.draw(f, f.size()); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } + self.linked_components + .draw_components( + f, + |chunk| self.main_layout.borrow().get_chunk(chunk), + self.observable_mode.get(), + &context_data_lock, + &table, + ) + .expect("Failed to draw components"); })?; } Action::Render => { + let context_data_ref = Arc::clone(&self.context_data); + let context_data_lock = context_data_ref.lock().await; + let table_ref = Arc::clone( + &self + .tables + .get_table_by_mode(self.observable_mode.get()) + .unwrap(), + ); + let table = table_ref.lock().await; tui.draw(|f| { - let r = self - .context_information - .draw(f, self.main_layout.borrow().get_chunk(Chunk::Context(0))); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - - if self.observable_mode.get() == Mode::Search { - let r = self - .command_search - .draw(f, self.main_layout.borrow().get_chunk(Chunk::Command)); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - } - - if self.observable_mode.get() == Mode::Command { - let r = self - .command - .draw(f, self.main_layout.borrow().get_chunk(Chunk::Command)); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - } - - let r = self - .shortcut - .draw(f, self.main_layout.borrow().get_chunk(Chunk::Context(1))); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - - let r = self - .ascii - .draw(f, self.main_layout.borrow().get_chunk(Chunk::Context(2))); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - - let r = self - .table_dag_runs - .draw(f, self.main_layout.borrow().get_chunk(Chunk::Table)); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - - let r = self - .status_bar - .draw(f, self.main_layout.borrow().get_chunk(Chunk::Status)); - if let Err(e) = r { - action_tx - .send(Action::Error(format!("Failed to draw: {:?}", e))) - .unwrap(); - } - })?; - } - Action::Search => { - self.status_bar.mode_breadcrumb.push(Mode::DagRun); - self.observable_mode.set_mode(Mode::Search); - self.status_bar.register_mode(self.observable_mode.get()); - self.observable_mode.set_mode(Mode::Search); - } - Action::Command => { - self.status_bar.mode_breadcrumb.push(Mode::DagRun); - self.observable_mode.set_mode(Mode::Command); - self.status_bar.register_mode(self.observable_mode.get()); - self.observable_mode.set_mode(Mode::Command); - } - Action::DagRun => { - self.status_bar.mode_breadcrumb.clear(); - self.command.command = None; - self.observable_mode.set_mode(Mode::DagRun); - self.status_bar.register_mode(self.observable_mode.get()); - self.table_dag_runs.position = None; - self.observable_mode.set_mode(Mode::DagRun); - } - Action::Code => { - self.observable_mode.set_mode(Mode::Code); - self.status_bar.mode_breadcrumb.push(Mode::DagRun); - self.status_bar.register_mode(self.observable_mode.get()); - self.table_dag_runs - .handle_mode(self.observable_mode.get())?; - let source_code = self.table_dag_runs.dag_runs.dag_runs - [self.table_dag_runs.table_state.selected().unwrap()] - .get_source_code(&self.client, &self.config.airflow) - .await?; - self.table_dag_runs.code = source_code.clone(); - self.observable_mode.set_mode(Mode::Code); - } - Action::Clear => { - if self.observable_mode.get() == Mode::DagRun - && self.table_dag_runs.table_state.selected().is_some() - { - self.dag_runs.dag_runs - [self.table_dag_runs.table_state.selected().unwrap()] - .clear( - &self.client, - &self.config.airflow, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - ) - .await?; - } - - if self.observable_mode.get() == Mode::Task - && self.table_dag_runs.table_state.selected().is_some() - { - self.table_dag_runs.tasks.as_mut().unwrap().task_instances - [self.table_dag_runs.table_tasks_state.selected().unwrap()] - .clear( - &self.client, - &self.config.airflow, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - ) - .await?; - } - } - Action::Task => { - self.status_bar.mode_breadcrumb.clear(); - self.status_bar.mode_breadcrumb.push(Mode::DagRun); - if self.table_dag_runs.table_state.selected().is_none() { - self.observable_mode.set_mode(Mode::DagRun); - self.observable_mode.set_mode(Mode::DagRun); - break; - } - self.observable_mode.set_mode(Mode::Task); - self.table_dag_runs.table_tasks_state.select(Some(0)); - self.table_dag_runs.tasks = Some( - self.dag_runs - .get_task( - &self.client, - &self.config.airflow, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - self.table_dag_runs.table_state.selected().unwrap_or(0), + self.linked_components + .draw_components( + f, + |chunk| self.main_layout.borrow().get_chunk(chunk), + self.observable_mode.get(), + &context_data_lock, + &table, ) - .await?, - ); - self.status_bar.register_mode(self.observable_mode.get()); + .expect("Failed to draw components "); + })?; } - Action::Log => { - self.status_bar.mode_breadcrumb.clear(); - self.status_bar.mode_breadcrumb.push(Mode::DagRun); - self.status_bar.mode_breadcrumb.push(Mode::Task); - self.observable_mode.set_mode(Mode::Log); - self.table_dag_runs - .handle_mode(self.observable_mode.get())?; - self.status_bar.register_mode(self.observable_mode.get()); - if self.table_dag_runs.table_state.selected().is_some() { - let log = self.table_dag_runs.tasks.as_mut().unwrap().task_instances - [self.table_dag_runs.table_tasks_state.selected().unwrap()] - .get_logs( - &self.client, - &self.config.airflow, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - self.table_dag_runs.try_number, - ) - .await?; - self.table_dag_runs.log = log; - }; + Action::Mode(mode) => { + self.observable_mode.set_mode(mode); } - Action::NextTryNumber => { - if self.table_dag_runs.table_tasks_state.selected().is_some() - && self.observable_mode.get() == Mode::Log - && self.table_dag_runs.tasks.as_ref().unwrap().task_instances - [self.table_dag_runs.table_tasks_state.selected().unwrap()] - .try_number as usize - > self.table_dag_runs.try_number - { - self.table_dag_runs.try_number += 1; - log::info!("{}", format!("{}", self.table_dag_runs.try_number)); - let log = self.table_dag_runs.tasks.as_mut().unwrap().task_instances - [self.table_dag_runs.table_tasks_state.selected().unwrap()] - .get_logs( - &self.client, - &self.config.airflow, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - self.table_dag_runs.try_number, - ) - .await?; - self.table_dag_runs.log = log; - } + Action::NextMode(current_mode) => { + self.observable_mode.set_next_mode(current_mode); + let context_data_ref = Arc::clone(&self.context_data); + let airflow_config = self.config.airflow.clone(); + let mode = self.observable_mode.get().clone(); + tokio::spawn(async move { + let mut lock = context_data_ref.lock().await; + lock.refresh(mode).await; + }); } - Action::PreviousTryNumber => { - if self.table_dag_runs.table_tasks_state.selected().is_some() - && self.observable_mode.get() == Mode::Log - && self.table_dag_runs.try_number > 1 - { - self.table_dag_runs.try_number -= 1; - log::info!("{}", format!("{}", self.table_dag_runs.try_number)); - let log = self.table_dag_runs.tasks.as_mut().unwrap().task_instances - [self.table_dag_runs.table_tasks_state.selected().unwrap()] - .get_logs( - &self.client, - &self.config.airflow, - &self.config.airflow.username, - &self.config.airflow.password, - &self.config.airflow.host, - self.table_dag_runs.try_number, - ) - .await?; - self.table_dag_runs.log = log; - } + Action::PreviousMode(mode) => { + self.observable_mode.set_mode(mode); } - Action::ClearSearch => { - self.table_dag_runs.user_search = None; + Action::Pool => { + self.observable_mode.set_mode(Mode::Pool); } _ => {} } - if let Some(action) = self.context_information.update(action.clone())? { - action_tx.send(action)? - }; - self.context_information - .register_context_information(&self.dag_runs); - - if let Some(action) = self.shortcut.update(action.clone())? { - action_tx.send(action)? - }; - self.shortcut.register_mode(self.observable_mode.get()); - - if let Some(action) = self.ascii.update(action.clone())? { - action_tx.send(action)? - }; - - if let Some(action) = self.command_search.update(action.clone())? { - action_tx.send(action)? - }; - self.command_search - .handle_mode(self.observable_mode.get())?; - - if let Some(action) = self.command.update(action.clone())? { - action_tx.send(action)? - }; - self.command.handle_mode(self.observable_mode.get())?; - if let Some(action) = self.table_dag_runs.update(action.clone())? { - action_tx.send(action)? - }; - self.table_dag_runs - .handle_mode(self.observable_mode.get())?; + let context_data_ref = Arc::clone(&self.context_data); + let mut lock = context_data_ref.lock().await; } if self.should_suspend { tui.suspend()?; diff --git a/src/components.rs b/src/components.rs index 19cf602..d0197b1 100644 --- a/src/components.rs +++ b/src/components.rs @@ -1,14 +1,26 @@ +use crate::components::table::table::LinkedTable; +use crate::components::table::table::{Table, Tables}; +use crate::mode::ObservableMode; +use std::cell::{Ref, RefCell, RefMut}; +use std::fmt::Debug; +use std::rc::Rc; + use color_eyre::eyre::Result; use crossterm::event::{KeyEvent, MouseEvent}; use ratatui::layout::Rect; use tokio::sync::mpsc::UnboundedSender; +use crate::context_data::ContextData; +use crate::main_layout::{Chunk, MainLayout}; use crate::mode::Mode; use crate::{ action::Action, config::Config, tui::{Event, Frame}, }; +use std::sync::Arc; +use tokio::sync::Mutex; +use tokio::sync::MutexGuard; pub mod ascii; pub mod command; @@ -17,7 +29,7 @@ pub mod context_informations; pub mod fps; pub mod shortcut; pub mod status_bar; -pub mod table_dag_runs; +pub mod table; /// `Component` is a trait that represents a visual and interactive element of the user interface. /// Implementors of this trait can be registered with the main application loop and will be able to receive events, @@ -70,7 +82,13 @@ pub trait Component { /// # Returns /// /// * `Result>` - An action to be processed or none. - fn handle_events(&mut self, event: Option) -> Result> { + fn handle_events( + &mut self, + event: Option<&Event>, + context_data: &mut MutexGuard<'_, ContextData>, + mode: &ObservableMode, + tables: &mut Tables, + ) -> Result> { let r = match event { Some(Event::Key(key_event)) => self.handle_key_events(key_event)?, Some(Event::Mouse(mouse_event)) => self.handle_mouse_events(mouse_event)?, @@ -101,7 +119,7 @@ pub trait Component { /// /// * `Result>` - An action to be processed or none. #[allow(unused_variables)] - fn handle_key_events(&mut self, key: KeyEvent) -> Result> { + fn handle_key_events(&mut self, key: &KeyEvent) -> Result> { Ok(None) } /// Handle mouse events and produce actions if necessary. @@ -114,7 +132,7 @@ pub trait Component { /// /// * `Result>` - An action to be processed or none. #[allow(unused_variables)] - fn handle_mouse_events(&mut self, mouse: MouseEvent) -> Result> { + fn handle_mouse_events(&mut self, mouse: &MouseEvent) -> Result> { Ok(None) } /// Update the state of the component based on a received action. (REQUIRED) @@ -127,7 +145,12 @@ pub trait Component { /// /// * `Result>` - An action to be processed or none. #[allow(unused_variables)] - fn update(&mut self, action: Action) -> Result> { + fn update( + &mut self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { Ok(None) } /// Render the component on the screen. (REQUIRED) @@ -140,5 +163,215 @@ pub trait Component { /// # Returns /// /// * `Result<()>` - An Ok result or an error. - fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()>; + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()>; +} + +impl Debug for dyn Component { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{:?}", self) + } +} + +pub type NodeComponentRef = Option>>; + +#[derive(Debug)] +pub struct NodeComponent { + pub value: Rc>, + pub next: NodeComponentRef, + pub chunk: Chunk, + pub display_mode: Option, +} + +impl NodeComponent { + pub fn new( + component: Rc>, + chunk: Chunk, + display_mode: Option, + ) -> Rc> { + Rc::new(RefCell::new(NodeComponent { + value: component, + next: None, + chunk, + display_mode, + })) + } +} + +#[derive(Debug)] +pub struct LinkedComponent { + pub head: NodeComponentRef, +} + +impl LinkedComponent { + pub fn new() -> Self { + LinkedComponent { head: None } + } + + pub fn append( + &mut self, + component: Rc>, + chunk: Chunk, + display_mode: Option, + ) { + let new_node: Rc> = + NodeComponent::new(component, chunk, display_mode); + match self.head { + None => { + self.head = Some(new_node); + } + Some(ref head) => { + let mut current = head.clone(); + loop { + let next = { current.borrow().next.clone() }; + match next { + Some(n) => current = n, + None => { + current.borrow_mut().next = Some(new_node.clone()); + break; + } + } + } + } + } + } + + pub fn draw_components( + &mut self, + f: &mut Frame<'_>, + get_chunk: F, + mode: Mode, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + ) -> Result<()> + where + F: Fn(&Chunk) -> Rect, + { + let mut current: Option>> = self.head.clone(); + while let Some(node) = current { + let node: Ref = node.borrow(); + let chunk: &Chunk = &node.chunk; + let display_mode: Option = node.display_mode; + let area: Rect = get_chunk(chunk); + if let Some(observable_mode) = display_mode { + if observable_mode != mode { + current = node.next.clone(); + continue; + } + } + node.value + .borrow_mut() + .draw(f, area, context_data, table, mode)?; + current = node.next.clone(); + } + Ok(()) + } + + pub fn register_action_components(&self, tx: &UnboundedSender) { + let mut current: Option>> = self.head.clone(); + while let Some(node) = current { + let node: Ref = node.borrow(); + let mut component = node.value.borrow_mut(); + component + .register_action_handler(tx.clone()) + .expect("TODO: panic message"); + current = node.next.clone(); + } + } + + pub fn register_config_components(&self, config: &Config) { + let mut current: Option>> = self.head.clone(); + while let Some(node) = current { + let node: Ref = node.borrow(); + let mut component = node.value.borrow_mut(); + component + .register_config_handler(config.clone()) + .expect("TODO: panic message"); + current = node.next.clone(); + } + } + + pub fn handle_events( + &self, + option: Option<&Event>, + context_data: &mut MutexGuard<'_, ContextData>, + mode: &ObservableMode, + tables: &mut Tables, + ) -> Result> { + let mut current: Option>> = self.head.clone(); + while let Some(node) = current { + let node: Ref = node.borrow(); + let mut component = node.value.borrow_mut(); + let action = component.handle_events(option, context_data, mode, tables)?; + current = node.next.clone(); + if current.is_none() && action.is_some() { + return Ok(action); + } + } + Ok(None) + } + + pub fn handle_actions( + &self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { + let mut current: Option>> = self.head.clone(); + while let Some(node) = current { + let node: Ref = node.borrow(); + let mut component = node.value.borrow_mut(); + component.update(action.clone(), context_data, tables); + current = node.next.clone(); + if current.is_none() { + return Ok(Some(action)); + } + } + Ok(None) + } + + pub fn get_component_by_idx(&self, usr_idx: usize) -> Option>> { + let mut current: Option>> = self.head.clone(); + let mut idx: usize = 0; + while let Some(node) = current { + let node: Ref = node.borrow(); + if idx == usr_idx { + return Some(node.value.clone()); + } + current = node.next.clone(); + } + None + } + + pub fn iter(&self) -> IterComponent { + IterComponent { + current: self.head.clone(), + } + } +} + +pub struct IterComponent { + pub(crate) current: NodeComponentRef, +} + +impl Iterator for IterComponent { + type Item = Rc>; + + fn next(&mut self) -> Option { + let current: Option>> = self.current.take(); + if current.is_none() { + return None; + } else { + let current: Rc> = current.unwrap(); + let current: RefMut = current.borrow_mut(); + self.current = current.next.clone(); + current.next.clone() + } + } } diff --git a/src/components/ascii.rs b/src/components/ascii.rs index 95243f5..9b5483c 100644 --- a/src/components/ascii.rs +++ b/src/components/ascii.rs @@ -1,5 +1,10 @@ +use crate::components::table::table::LinkedTable; +use crate::components::Table; +use crate::mode::Mode; use std::{collections::HashMap, time::Duration}; +use tokio::sync::MutexGuard; +use crate::context_data::ContextData; use color_eyre::eyre::Result; use color_eyre::owo_colors::OwoColorize; use crossterm::event::{KeyCode, KeyEvent}; @@ -47,12 +52,24 @@ impl Component for Ascii { Ok(()) } - fn update(&mut self, action: Action) -> Result> { + fn update( + &mut self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { {} Ok(None) } - fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> { + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()> { let block = Paragraph::new(self.ascii) .block(Block::new()) .style(Style::default().fg(Color::Magenta)); diff --git a/src/components/command.rs b/src/components/command.rs index 4e2509c..657a96a 100644 --- a/src/components/command.rs +++ b/src/components/command.rs @@ -1,4 +1,7 @@ +use crate::components::table::table::LinkedTable; +use crate::components::Table; use std::{collections::HashMap, time::Duration, vec}; +use tokio::sync::MutexGuard; use color_eyre::eyre::Result; use color_eyre::owo_colors::OwoColorize; @@ -11,6 +14,7 @@ use tokio::sync::mpsc::UnboundedSender; use super::{Component, Frame}; use crate::config::key_event_to_string; +use crate::context_data::ContextData; use crate::mode::Mode; use crate::utils::get_user_input_by_key; use crate::{ @@ -53,18 +57,30 @@ impl Component for Command { Ok(()) } - fn handle_key_events(&mut self, key: KeyEvent) -> Result> { + fn handle_key_events(&mut self, key: &KeyEvent) -> Result> { if self.mode == Mode::Command { get_user_input_by_key(key.code, &mut self.command); } Ok(None) } - fn update(&mut self, action: Action) -> Result> { + fn update( + &mut self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { Ok(None) } - fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> { + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()> { // draw the search bar let line = Line::from(vec![if let Some(command) = &self.command { Span::raw(command) diff --git a/src/components/command_search.rs b/src/components/command_search.rs index 321e34e..b6f4ad8 100644 --- a/src/components/command_search.rs +++ b/src/components/command_search.rs @@ -1,4 +1,7 @@ +use crate::components::table::table::LinkedTable; +use crate::components::Table; use std::{collections::HashMap, time::Duration, vec}; +use tokio::sync::MutexGuard; use color_eyre::eyre::Result; use color_eyre::owo_colors::OwoColorize; @@ -11,6 +14,7 @@ use tokio::sync::mpsc::UnboundedSender; use super::{Component, Frame}; use crate::config::key_event_to_string; +use crate::context_data::ContextData; use crate::mode::Mode; use crate::utils::get_user_input_by_key; use crate::{ @@ -53,18 +57,30 @@ impl Component for CommandSearch { Ok(()) } - fn handle_key_events(&mut self, key: KeyEvent) -> Result> { + fn handle_key_events(&mut self, key: &KeyEvent) -> Result> { if self.mode == Mode::Search { get_user_input_by_key(key.code, &mut self.user_search); } Ok(None) } - fn update(&mut self, action: Action) -> Result> { + fn update( + &mut self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { Ok(None) } - fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> { + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()> { // draw the search bar let line = Line::from(vec![if let Some(search) = &self.user_search { Span::raw(search) diff --git a/src/components/context_informations.rs b/src/components/context_informations.rs index 985ef01..e85420c 100644 --- a/src/components/context_informations.rs +++ b/src/components/context_informations.rs @@ -1,4 +1,8 @@ +use crate::components::table::table::LinkedTable; +use crate::components::Table; +use crate::mode::Mode; use std::{collections::HashMap, time::Duration}; +use tokio::sync::MutexGuard; use color_eyre::eyre::Result; use crossterm::event::{KeyCode, KeyEvent}; @@ -8,6 +12,7 @@ use tokio::io::split; use tokio::sync::mpsc::UnboundedSender; use super::{Component, Frame}; +use crate::context_data::ContextData; use crate::models::dag_runs::DagRuns; use crate::{ action::Action, @@ -39,15 +44,6 @@ impl ContextInformation { total_dag_runs_queued: 0, } } - - pub fn register_context_information(&mut self, dag_runs: &DagRuns) { - self.total_dag_runs = dag_runs.get_total_entries(); - self.total_dag_runs_running = dag_runs.get_count_dag_run_running(); - self.total_dag_runs_failed = dag_runs.get_count_dag_run_failed(); - self.total_dag_runs_scheduled = dag_runs.get_count_dag_run_scheduled(); - self.total_dag_runs_success = dag_runs.get_count_dag_run_success(); - self.total_dag_runs_queued = dag_runs.get_count_dag_run_queued(); - } } impl Component for ContextInformation { @@ -61,12 +57,24 @@ impl Component for ContextInformation { Ok(()) } - fn update(&mut self, action: Action) -> Result> { + fn update( + &mut self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { {} Ok(None) } - fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> { + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()> { // Align the value on the right to the same starting point let text = vec![ Line::from(vec![ diff --git a/src/components/context_informations/main.rs b/src/components/context_informations/main.rs new file mode 100644 index 0000000..0656b9f --- /dev/null +++ b/src/components/context_informations/main.rs @@ -0,0 +1,100 @@ +use std::{collections::HashMap, time::Duration}; +use tokio::sync::MutexGuard; + +use color_eyre::eyre::Result; +use crossterm::event::{KeyCode, KeyEvent}; +use ratatui::{prelude::*, widgets::*}; +use serde::{Deserialize, Serialize}; +use tokio::io::split; +use tokio::sync::mpsc::UnboundedSender; + +use super::{Component, Frame}; +use crate::context_data::ContextData; +use crate::models::dag_runs::DagRuns; +use crate::{ + action::Action, + config::{Config, KeyBindings}, +}; + +#[derive(Default)] +pub struct ContextInformation { + command_tx: Option>, + config: Config, + total_dag_runs: u32, + total_dag_runs_running: u32, + total_dag_runs_failed: u32, + total_dag_runs_scheduled: u32, + total_dag_runs_success: u32, + total_dag_runs_queued: u32, +} + +impl ContextInformation { + pub fn new() -> Self { + Self { + command_tx: None, + config: Config::default(), + total_dag_runs: 0, + total_dag_runs_running: 0, + total_dag_runs_failed: 0, + total_dag_runs_scheduled: 0, + total_dag_runs_success: 0, + total_dag_runs_queued: 0, + } + } +} + +impl Component for ContextInformation { + fn register_action_handler(&mut self, tx: UnboundedSender) -> Result<()> { + self.command_tx = Some(tx); + Ok(()) + } + + fn register_config_handler(&mut self, config: Config) -> Result<()> { + self.config = config; + Ok(()) + } + + fn update(&mut self, action: Action, context_data: &MutexGuard<'_, ContextData>) -> Result> { + {} + Ok(None) + } + + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + ) -> Result<()> { + log::info!("Draw ContextInformation"); + // Align the value on the right to the same starting point + let text = vec![ + Line::from(vec![ + Span::styled("Dag Runs Number : ", Style::new().yellow()), + Span::raw(format!("{}", self.total_dag_runs)), + ]), + Line::from(vec![ + Span::styled("Dag Runs Running : ", Style::new().yellow()), + Span::raw(format!("{}", self.total_dag_runs_running)), + ]), + Line::from(vec![ + Span::styled("Dag Runs Failed : ", Style::new().yellow()), + Span::raw(format!("{}", self.total_dag_runs_failed)), + ]), + Line::from(vec![ + Span::styled("Dag Runs Scheduled : ", Style::new().yellow()), + Span::raw(format!("{}", self.total_dag_runs_scheduled)), + ]), + Line::from(vec![ + Span::styled("Dag Runs Queued : ", Style::new().yellow()), + Span::raw(format!("{}", self.total_dag_runs_queued)), + ]), + Line::from(vec![ + Span::styled("ARVZ version : ", Style::new().yellow()), + Span::raw("0.1.0".to_string()), + ]), + ]; + let block = Paragraph::new(text).block(Block::new()); + f.render_widget(block, area); + Ok(()) + } +} diff --git a/src/components/fps.rs b/src/components/fps.rs index 4885229..552ae09 100644 --- a/src/components/fps.rs +++ b/src/components/fps.rs @@ -1,9 +1,14 @@ +use crate::components::table::table::LinkedTable; +use crate::components::Table; +use crate::mode::Mode; use std::time::Instant; +use tokio::sync::MutexGuard; use color_eyre::eyre::Result; use ratatui::{prelude::*, widgets::*}; use super::Component; +use crate::context_data::ContextData; use crate::{action::Action, tui::Frame}; #[derive(Debug, Clone, PartialEq)] @@ -61,7 +66,12 @@ impl FpsCounter { } impl Component for FpsCounter { - fn update(&mut self, action: Action) -> Result> { + fn update( + &mut self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { if let Action::Tick = action { self.app_tick()? }; @@ -71,7 +81,14 @@ impl Component for FpsCounter { Ok(None) } - fn draw(&mut self, f: &mut Frame<'_>, rect: Rect) -> Result<()> { + fn draw( + &mut self, + f: &mut Frame<'_>, + rect: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()> { Ok(()) } } diff --git a/src/components/shortcut.rs b/src/components/shortcut.rs index 5d25b0e..53b554d 100644 --- a/src/components/shortcut.rs +++ b/src/components/shortcut.rs @@ -1,4 +1,7 @@ +use crate::components::table::table::LinkedTable; +use crate::components::Table; use std::{collections::HashMap, time::Duration, vec}; +use tokio::sync::MutexGuard; use color_eyre::eyre::Result; use color_eyre::owo_colors::OwoColorize; @@ -12,13 +15,14 @@ use tokio::sync::mpsc::UnboundedSender; use super::{Component, Frame}; use crate::config::key_event_to_string; +use crate::context_data::ContextData; use crate::mode::Mode; use crate::{ action::Action, config::{Config, KeyBindings}, }; -#[derive(Default)] +#[derive(Default, Debug)] pub struct Shortcut { command_tx: Option>, config: Config, @@ -27,7 +31,11 @@ pub struct Shortcut { impl Shortcut { pub fn new() -> Self { - Self::default() + Self { + command_tx: None, + config: Config::default(), + mode: Mode::Pool, + } } pub fn register_mode(&mut self, mode: Mode) { @@ -46,15 +54,26 @@ impl Component for Shortcut { Ok(()) } - fn update(&mut self, action: Action) -> Result> { + fn update( + &mut self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { {} Ok(None) } - fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> { - // Loop through keybindings by mode and display them - // Get the number of keybindings for the current mode - let num_keybindings = self.config.keybindings.get(&self.mode).unwrap().len() as f64; + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()> { + let num_keybindings = 10f64; let number_of_columns = (num_keybindings / 6f64).ceil() as u16; diff --git a/src/components/status_bar.rs b/src/components/status_bar.rs index fdc292b..165f841 100644 --- a/src/components/status_bar.rs +++ b/src/components/status_bar.rs @@ -1,4 +1,7 @@ +use crate::components::table::table::LinkedTable; +use crate::components::Table; use std::{collections::HashMap, time::Duration, vec}; +use tokio::sync::MutexGuard; use color_eyre::eyre::Result; use color_eyre::owo_colors::OwoColorize; @@ -12,6 +15,7 @@ use tracing_subscriber::fmt::format; use super::{Component, Frame}; use crate::config::key_event_to_string; +use crate::context_data::ContextData; use crate::mode::Mode; use crate::{ action::Action, @@ -52,12 +56,24 @@ impl Component for StatusBar { Ok(()) } - fn update(&mut self, action: Action) -> Result> { + fn update( + &mut self, + action: Action, + context_data: &MutexGuard<'_, ContextData>, + tables: &MutexGuard<'_, LinkedTable>, + ) -> Result> { {} Ok(None) } - fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> { + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()> { // Create a new block with self.mode_breadcrumb.len() + 1 columns // Space between each column is 10 self.mode_breadcrumb.push(self.mode); @@ -76,14 +92,19 @@ impl Component for StatusBar { for (i, mode) in self.mode_breadcrumb.iter().enumerate() { let para = Paragraph::new(format!("<{:?}>", mode)) .alignment(Alignment::Center) - .style(Style::default().fg(Color::DarkGray).bg(Color::Yellow)); + .style(Style::default().fg(Color::Black).bg(Color::Yellow)); f.render_widget(para, block[i]); } } let para = Paragraph::new(format!("<{:?}>", self.mode)) .alignment(Alignment::Center) - .style(Style::default().fg(Color::DarkGray).bg(Color::LightCyan)); + .style( + Style::default() + .fg(Color::Black) + .bg(Color::LightCyan) + .add_modifier(Modifier::BOLD), + ); f.render_widget(para, block[self.mode_breadcrumb.len() - 1]); self.mode_breadcrumb.pop(); Ok(()) diff --git a/src/components/table/dag_run.rs b/src/components/table/dag_run.rs new file mode 100644 index 0000000..0aab53b --- /dev/null +++ b/src/components/table/dag_run.rs @@ -0,0 +1,28 @@ +use crate::components::table::table::Table; +use ratatui::prelude::{Color, Style}; + +#[derive(Default)] +pub struct DagRun {} + +impl DagRun { + pub fn new() -> Self { + Self {} + } +} + +impl Table for DagRun { + fn get_columns(&self) -> Vec<&'static str> { + vec![ + "DAG ID", + "STATE", + "START DATE", + "END DATE", + "RUN TYPE", + "EXTERNAL TRIGGER", + ] + } + + fn get_border_style(&self) -> Style { + Style::default().fg(Color::LightCyan) + } +} diff --git a/src/components/table/main.rs b/src/components/table/main.rs new file mode 100644 index 0000000..358772a --- /dev/null +++ b/src/components/table/main.rs @@ -0,0 +1,212 @@ +use crate::components::Table; +use crate::components::Tables; +use crate::mode::ObservableMode; +use crate::tui::Event; +use crate::tui::Event::Key; +use color_eyre::eyre::Result; +use color_eyre::owo_colors::OwoColorize; +use crossterm::event::{KeyCode, KeyEvent}; +use libc::bind; +use ratatui::symbols::border; +use ratatui::widgets::block::{Position, Title}; +use ratatui::widgets::Table as TableRatatui; +use ratatui::{prelude::*, widgets::*}; +use serde::{Deserialize, Serialize}; +use std::cell::RefCell; +use std::ops::Deref; +use std::rc::Rc; +use std::sync::Arc; +use std::{collections::HashMap, time::Duration, vec}; +use tokio::sync::mpsc::UnboundedSender; +use tokio::sync::MutexGuard; +use tracing_subscriber::fmt::format; + +use crate::components::ascii::Ascii; +use crate::components::command::Command; +use crate::components::command_search::CommandSearch; +use crate::components::context_informations::ContextInformation; +use crate::components::shortcut::Shortcut; +use crate::components::status_bar::StatusBar; +use crate::components::table::dag_run::DagRun; +use crate::components::table::pool::Pool; +use crate::components::table::table::LinkedTable; +use crate::components::{Component, LinkedComponent}; +use crate::config::key_event_to_string; +use crate::context_data::ContextData; +use crate::main_layout::Chunk; +use crate::mode::Mode; +use crate::{ + action::Action, + config::{Config, KeyBindings}, +}; +use tokio::sync::Mutex; + +#[derive(Default)] +pub struct MainTable { + command_tx: Option>, + config: Config, + state: TableState, + previous_mode: Option, + last_container: Option, + container: String, + previous_table: bool, + history: Vec, +} + +impl MainTable { + pub fn new() -> Self { + Self { + command_tx: None, + config: Config::default(), + state: TableState::new(), + previous_mode: None, + last_container: None, + container: String::from("all"), + previous_table: false, + history: vec![Mode::Pool], + } + } +} + +impl Component for MainTable { + fn register_action_handler(&mut self, tx: UnboundedSender) -> Result<()> { + self.command_tx = Some(tx); + Ok(()) + } + + fn register_config_handler(&mut self, config: Config) -> Result<()> { + self.config = config; + Ok(()) + } + + fn handle_events( + &mut self, + event: Option<&Event>, + context_data: &mut MutexGuard<'_, ContextData>, + mode: &ObservableMode, + tables: &mut Tables, + ) -> Result> { + match event { + Some(event) => match event { + Key(key_event) => { + match key_event.code { + KeyCode::Down => { + if let Some(selected) = self.state.selected() { + match &context_data.get_model_by_mode(mode.get()).unwrap() { + Some(data) => { + if ((selected + 1) as i32) < data.get_total_entries() { + self.state.select(Some(selected + 1)) + } + } + None => log::info!("No pool collection"), + }; + } else { + self.state.select(Some(0)) + } + } + KeyCode::Up => { + if let Some(selected) = self.state.selected() { + if selected > 0 { + self.state.select(Some(selected - 1)); + } + } else { + self.state.select(Some(0)) + } + } + KeyCode::Enter => { + self.command_tx + .as_ref() + .unwrap() + .send(Action::NextMode(mode.get())); + self.previous_mode = Some(mode.get()); + self.history.push(mode.get_next_mode(mode.get())); + if let Some(binding) = + context_data.get_model_by_mode(mode.get()).unwrap() + { + if let Some(element) = + binding.get_element(self.state.selected().expect("No selected")) + { + self.container = element.get_id().to_string(); + context_data.params = Some(element.get_id().to_string()); + } + } + self.state.select(None); + } + KeyCode::Esc => { + if mode.get() != self.history[0] { + if let Some(previous) = self.previous_mode { + self.history.pop(); + self.command_tx + .as_ref() + .unwrap() + .send(Action::PreviousMode(previous)); + self.state.select(None); + } + } + } + _ => { + log::info!("Key not implemented"); + } + } + Ok(None) + } + _ => Ok(None), + }, + None => Ok(None), + } + } + + fn draw( + &mut self, + f: &mut Frame<'_>, + area: Rect, + context_data: &MutexGuard<'_, ContextData>, + table: &MutexGuard<'_, dyn Table>, + mode: Mode, + ) -> Result<()> { + let columns = &table.get_columns(); + let binding = context_data + .get_model_by_mode(mode) + .unwrap() + .as_ref() + .expect(""); + let container = if self.history.len() == 1 { + String::from("all") + } else { + self.container.clone() + }; + let mut title = vec![ + Span::styled(format!(" {:?}", mode), Style::new().light_cyan()), + Span::styled(format!("("), Style::default().fg(Color::LightCyan)), + Span::styled( + format!("{}", container), + Style::default().fg(Color::Magenta), + ), + Span::styled(format!(")"), Style::default().fg(Color::LightCyan)), + Span::styled("[", Style::new().white()), + Span::styled( + binding.get_total_entries().to_string(), + Style::default().fg(Color::LightCyan), + ), + Span::styled("] ", Style::new().white()), + ]; + let rows: Vec = binding.get_rows(); + let widths = columns + .iter() + .map(|_| Constraint::Percentage(100 / columns.len() as u16)) + .collect::>(); + let table = TableRatatui::new(rows, widths) + .header(Row::new(columns.to_vec()).bottom_margin(0)) + .block( + Block::default() + .title(Line::from(title)) + .title_alignment(Alignment::Center) + .borders(Borders::ALL) + .border_style(Style::default().fg(Color::LightCyan)), + ) + .highlight_style(Style::new().add_modifier(Modifier::REVERSED)); + + f.render_stateful_widget(table, area, &mut self.state); + Ok(()) + } +} diff --git a/src/components/table/mod.rs b/src/components/table/mod.rs new file mode 100644 index 0000000..11b520b --- /dev/null +++ b/src/components/table/mod.rs @@ -0,0 +1,5 @@ +pub mod dag_run; +pub mod main; +pub mod pool; +pub mod table; +pub mod task; diff --git a/src/components/table/pool.rs b/src/components/table/pool.rs new file mode 100644 index 0000000..5fd43ab --- /dev/null +++ b/src/components/table/pool.rs @@ -0,0 +1,31 @@ +use crate::components::table::table::Table; +use ratatui::prelude::{Color, Style}; + +#[derive(Default)] +pub struct Pool {} + +impl Pool { + pub fn new() -> Self { + Self {} + } +} + +impl Table for Pool { + fn get_columns(&self) -> Vec<&'static str> { + vec![ + "deferred_slots", + "include_deferred", + "name", + "occupied_slots", + "open_slots", + "queued_slots", + "running_slots", + "scheduled_slots", + "slots", + ] + } + + fn get_border_style(&self) -> Style { + Style::default().fg(Color::LightCyan) + } +} diff --git a/src/components/table/table.rs b/src/components/table/table.rs new file mode 100644 index 0000000..659e062 --- /dev/null +++ b/src/components/table/table.rs @@ -0,0 +1,107 @@ +use crate::components::table::pool::Pool as TablePool; +use crate::components::table::task::Task as TableTask; +use crate::mode::Mode; +use crate::mode::Mode::Pool; +use crate::mode::Mode::Task; +use core::fmt::Debug; +use ratatui::prelude::Style; +use std::cell::RefCell; +use std::collections::HashMap; +use std::rc::Rc; +use std::sync::{Arc, MutexGuard}; +use tokio::sync::Mutex; + +pub trait Table { + fn get_columns(&self) -> Vec<&'static str>; + fn get_border_style(&self) -> Style; +} + +pub type TableNodeComponentRef = Option>>; + +pub struct TableNodeComponent { + pub value: Arc>, + pub next: TableNodeComponentRef, + pub previous: TableNodeComponentRef, +} + +impl TableNodeComponent { + pub fn new(component: Arc>) -> Arc> { + Arc::new(Mutex::new(TableNodeComponent { + value: component, + next: None, + previous: None, + })) + } +} + +pub struct LinkedTable { + pub head: TableNodeComponentRef, +} + +impl LinkedTable { + pub fn new() -> Self { + Self { head: None } + } + + pub async fn append(&mut self, table: Arc>) { + let new_node = TableNodeComponent::new(table); + + match &self.head { + Some(head) => { + let mut current = Arc::clone(head); + + loop { + let current_ref = current.lock().await; + + match ¤t_ref.next { + Some(next) => { + let current = Arc::clone(next); + } + None => { + break; + } + } + } + + let mut current_mut = current.lock().await; + current_mut.next = Some(Arc::clone(&new_node)); + new_node.lock().await.previous = Some(Arc::clone(¤t)); + } + None => { + self.head = Some(Arc::clone(&new_node)); + } + } + } + + pub async fn next(&mut self) { + if let Some(head) = self.head.take() { + if let Some(next) = head.lock().await.next.clone() { + self.head = Some(next); + } + } + } +} + +pub struct Tables { + tables: [(Mode, Arc>); 2], +} + +impl Tables { + pub fn new() -> Tables { + Tables { + tables: [ + (Pool, Arc::new(Mutex::new(TablePool::default()))), + (Task, Arc::new(Mutex::new(TableTask::default()))), + ], + } + } + + pub fn get_table_by_mode(&self, mode: Mode) -> Option<&Arc>> { + for (table_mode, table) in &self.tables { + if table_mode == &mode { + return Some(table); + } + } + None + } +} diff --git a/src/components/table/task.rs b/src/components/table/task.rs new file mode 100644 index 0000000..3537269 --- /dev/null +++ b/src/components/table/task.rs @@ -0,0 +1,15 @@ +use crate::components::table::table::Table; +use ratatui::prelude::{Color, Style}; + +#[derive(Default)] +pub struct Task {} + +impl Table for Task { + fn get_columns(&self) -> Vec<&'static str> { + vec!["OPERATOR", "TASK ID", "TRY NUMBER", "STATE", "DURATION"] + } + + fn get_border_style(&self) -> Style { + Style::default().fg(Color::LightCyan) + } +} diff --git a/src/components/table_dag_runs.rs b/src/components/table_dag_runs.rs deleted file mode 100644 index 7bb808a..0000000 --- a/src/components/table_dag_runs.rs +++ /dev/null @@ -1,279 +0,0 @@ -use std::usize; -use std::{collections::HashMap, time::Duration}; - -use color_eyre::eyre::Result; -use color_eyre::owo_colors::OwoColorize; -use crossterm::event::{KeyCode, KeyEvent}; -use ratatui::widgets::block::title; -use ratatui::{prelude::*, widgets::*}; -use reqwest::Client; -use serde::de::Unexpected::Str; -use serde::{Deserialize, Serialize}; -use tokio::sync::mpsc::UnboundedSender; -use tracing_subscriber::fmt::format; - -use super::{Component, Frame}; -use crate::mode::Mode; -use crate::models::dag_run::DagRun; -use crate::models::dag_runs::DagRuns; -use crate::models::tasks::Tasks; -use crate::utils::get_user_input_by_key; -use crate::{ - action::Action, - config::{Config, KeyBindings}, -}; - -#[derive(Default)] -pub struct TableDagRuns { - command_tx: Option>, - config: Config, - mode: Mode, - columns: Vec<&'static str>, - pub(crate) dag_runs: DagRuns, - pub(crate) table_state: TableState, - pub(crate) user_search: Option, - client: Client, - pub(crate) tasks: Option, - pub(crate) table_tasks_state: TableState, - pub(crate) log: String, - pub(crate) code: String, - pub try_number: usize, - pub scrollbar: Option, - pub position: Option, - pub heigh_lines: u16, -} - -impl TableDagRuns { - pub fn new() -> Self { - Self { - command_tx: None, - config: Config::default(), - mode: Mode::DagRun, - columns: vec![ - "DAG ID", - "STATE", - "START DATE", - "END DATE", - "RUN TYPE", - "EXTERNAL TRIGGER", - ], - dag_runs: DagRuns::default(), - table_state: TableState::default(), - user_search: None, - client: Client::new(), - tasks: None, - table_tasks_state: TableState::default(), - log: String::from(""), - code: String::from(""), - try_number: 1, - scrollbar: None, - position: None, - heigh_lines: 0, - } - } - - pub fn set_dag_runs(&mut self, dag_runs: DagRuns) { - self.dag_runs = dag_runs; - } -} - -impl Component for TableDagRuns { - fn register_action_handler(&mut self, tx: UnboundedSender) -> Result<()> { - self.command_tx = Some(tx); - Ok(()) - } - - fn register_config_handler(&mut self, config: Config) -> Result<()> { - self.config = config; - Ok(()) - } - - fn handle_mode(&mut self, mode: Mode) -> Result<()> { - if self.mode == Mode::Search { - self.table_state.select(None); - } - self.mode = mode; - Ok(()) - } - - fn handle_key_events(&mut self, key: KeyEvent) -> Result> { - if self.mode == Mode::Search { - get_user_input_by_key(key.code, &mut self.user_search); - } - Ok(None) - } - - fn update(&mut self, action: Action) -> Result> { - let table_state = if self.mode == Mode::Task { - &mut self.table_tasks_state - } else { - &mut self.table_state - }; - match action { - Action::Next => { - if table_state.selected().is_none() { - table_state.select(Some(0)); - } else if let Some(selected_index) = table_state.selected() { - if self.mode == Mode::Task { - if selected_index < self.tasks.as_ref().unwrap().task_instances.len() - 1 { - table_state.select(Some(selected_index + 1)); - } - } else if let Some(search) = &self.user_search { - let filtered = self.dag_runs.get_dag_runs_rows_filtered(search); - if selected_index < filtered.len() - 1 { - self.table_state.select(Some(selected_index + 1)); - } - } else if selected_index < self.dag_runs.dag_runs.len() - 1 { - self.table_state.select(Some(selected_index + 1)); - } - } - } - Action::Previous => { - // If is the first element, don't do anything - if let Some(selected_index) = table_state.selected() { - if selected_index > 0 { - table_state.select(Some(selected_index - 1)); - } - } - } - Action::DagRun => { - self.handle_mode(Mode::DagRun)?; - self.columns = vec![ - "DAG ID", - "STATE", - "START DATE", - "END DATE", - "RUN TYPE", - "EXTERNAL TRIGGER", - ]; - } - Action::Task => { - self.handle_mode(Mode::Task)?; - self.columns = vec!["OPERATOR", "TASK ID", "TRY NUMBER", "STATE", "DURATION"]; - } - Action::Up => { - if self.position.unwrap() > 0 { - self.position = Some(self.position.unwrap() - 1); - } - } - Action::Down => { - let lines = if self.mode == Mode::Log { - self.log.lines().count() - } else { - self.code.lines().count() + 2 - }; - if lines > self.heigh_lines as usize - && self.position.unwrap() < (lines - self.heigh_lines as usize) - { - self.position = Some(self.position.unwrap() + 1); - } - } - _ => {} - } - Ok(None) - } - - fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> { - let rows: Vec = if self.mode == Mode::Task { - if let Some(tasks) = &self.tasks { - tasks.get_tasks_row() - } else { - vec![] - } - } else if let Some(search) = &self.user_search { - self.dag_runs.get_dag_runs_rows_filtered(search) - } else { - self.dag_runs.get_dag_runs_rows_context() - }; - // Set the width of the columns - let widths = self - .columns - .iter() - .map(|_| Constraint::Percentage(100 / self.columns.len() as u16)) - .collect::>(); - let mut title = vec![ - Span::styled(format!(" {:?}(", self.mode), Style::new().light_cyan()), - Span::styled( - if self.mode == Mode::Task { - self.dag_runs.dag_runs[self.table_state.selected().unwrap()] - .dag_run_id - .to_string() - } else if self.mode == Mode::Log { - self.tasks.as_ref().unwrap().task_instances - [self.table_tasks_state.selected().unwrap()] - .task_id - .to_string() - } else { - String::from("all") - }, - Style::new().magenta(), - ), - Span::styled(")", Style::new().light_cyan()), - Span::styled("[", Style::new().white()), - Span::styled( - format!( - "{}", - if self.mode == Mode::Log { - self.try_number as u32 - } else { - self.dag_runs.get_total_entries() - } - ), - Style::new().light_yellow(), - ), - Span::styled("] ", Style::new().white()), - ]; - if let Some(search) = &self.user_search { - title.push(Span::raw("<")); - title.push(Span::styled( - format!("/{}", search), - Style::new().bg(Color::Green), - )); - title.push(Span::raw("> ")); - } - - if self.mode == Mode::Log || self.mode == Mode::Code { - self.heigh_lines = area.height; - if self.position.is_none() { - self.position = Some(0); - } - let log = Paragraph::new(if self.mode == Mode::Log { - Text::raw(&self.log) - } else { - Text::raw(&self.code) - }) - .scroll((self.position.unwrap() as u16, 0)) - .block( - Block::default() - .title(Line::from(title)) - .title_alignment(Alignment::Center) - .borders(Borders::ALL) - .border_style(Style::default().fg(Color::LightBlue)), - ); - f.render_widget(log, area); - return Ok(()); - } else { - let table = Table::new(rows, widths) - .header(Row::new(self.columns.to_vec()).bottom_margin(0)) - .block( - Block::default() - .title(Line::from(title)) - .title_alignment(Alignment::Center) - .borders(Borders::ALL) - .border_style(Style::default().fg(Color::LightBlue)), - ) - .highlight_style(Style::new().add_modifier(Modifier::REVERSED)); - - f.render_stateful_widget( - table, - area, - if self.mode == Mode::Task { - &mut self.table_tasks_state - } else { - &mut self.table_state - }, - ); - } - Ok(()) - } -} diff --git a/src/context_data.rs b/src/context_data.rs new file mode 100644 index 0000000..c5c34f9 --- /dev/null +++ b/src/context_data.rs @@ -0,0 +1,118 @@ +use crate::config::{Airflow, Config}; +use crate::mode::Mode; +use crate::models::dag_runs::DagRuns; +use crate::models::model_airflow::ModelAirflow; +use crate::models::model_airflow::ModelView; +use crate::models::tasks::Tasks; +use color_eyre::Result; +use reqwest::Client; +use std::cell::RefCell; +use std::rc::Rc; +use tokio::sync::mpsc::UnboundedSender; + +use crate::models::pool::{Pool, PoolCollection}; + +#[derive(Debug)] +pub struct ContextData { + pub pool_collection: Option>, + pub task_instances: Option>, + pub airflow_config: Airflow, + pub params: Option, + client: Client, +} + +impl ContextData { + pub(crate) fn new() -> ContextData { + ContextData { + pool_collection: Some(Box::new(PoolCollection::new())), + task_instances: Some(Box::new(Tasks::new())), + airflow_config: Airflow::default(), + params: None, + client: Client::default(), + } + } + + pub(crate) fn handle_airflow_config(&mut self, airflow_config: Airflow) { + self.airflow_config = airflow_config.clone(); + } + + pub fn get_model_by_mode(&self, mode: Mode) -> Result<&Option>> { + match mode { + Mode::Pool => Ok(&self.pool_collection), + Mode::Task => Ok(&self.task_instances), + _ => todo!(), + } + } + + pub fn get_mut_model_by_mode( + &mut self, + mode: Mode, + ) -> Result<&mut Option>> { + match mode { + Mode::Pool => Ok(&mut self.pool_collection), + Mode::Task => Ok(&mut self.task_instances), + _ => todo!(), + } + } + + pub fn get_deserialize<'a>(&mut self, mode: Mode, data: &str) -> Result> { + match mode { + Mode::Pool => { + self.pool_collection.as_mut().unwrap().deserialize(&data); + return Ok(Some( + self.pool_collection.as_mut().unwrap().get_view_model(), + )); + } + Mode::Task => { + self.task_instances.as_mut().unwrap().deserialize(&data); + return Ok(Some(self.task_instances.as_mut().unwrap().get_view_model())); + } + _ => log::error!("Mode not known"), + }; + Ok(None) + } + + pub async fn refresh<'a>(&'a mut self, mode: Mode) -> Result> { + let model = self.get_model_by_mode(mode).unwrap(); + let data = self + .client + .get( + self.airflow_config.host.as_str().to_owned() + + &model + .as_ref() + .expect("Unable to get ref of the model") + .get_endpoint(self.params.clone()), + ) + .basic_auth( + &self.airflow_config.username, + Some(&self.airflow_config.password), + ) + .send() + .await? + .text() + .await?; + Ok(None) + } + + pub async fn refresh_bis(&mut self, mode: Mode) -> color_eyre::Result<()> { + let model = self.get_model_by_mode(mode).unwrap(); + let data = self + .client + .get( + self.airflow_config.host.as_str().to_owned() + + &model + .as_ref() + .expect("Unable to get ref of the model") + .get_endpoint(self.params.clone()), + ) + .basic_auth( + &self.airflow_config.username, + Some(&self.airflow_config.password), + ) + .send() + .await? + .text() + .await?; + Ok(()) + } +} diff --git a/src/flamegraph.svg b/src/flamegraph.svg new file mode 100644 index 0000000..9973cf7 --- /dev/null +++ b/src/flamegraph.svg @@ -0,0 +1,491 @@ +Flame Graph Reset ZoomSearch arvz`config::file::format::FileFormat::parse (1 samples, 0.05%)arvz`config::file::format::json5::parse (1 samples, 0.05%)arvz`json5::de::from_str (1 samples, 0.05%)arvz`json5::de::Deserializer::from_str (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse (1 samples, 0.05%)arvz`pest::parser_state::state (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::text (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::text::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::text::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::value (1 samples, 0.05%)arvz`core::result::Result<T,E>::or_else (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::value::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::rule (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::or_else (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::pair (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::pair::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::pair::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::value (1 samples, 0.05%)arvz`core::result::Result<T,E>::or_else (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::value::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::rule (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::or_else (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::pair (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::pair::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::pair::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::value (1 samples, 0.05%)arvz`core::result::Result<T,E>::or_else (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::value::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::rule (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::or_else (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::optional (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::repeat (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::object::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::hidden::skip (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::hidden::skip::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::hidden::skip::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::repeat (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::hidden::skip::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::sequence (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::hidden::skip::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`core::result::Result<T,E>::and_then (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::hidden::skip::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::repeat (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::hidden::skip::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`<json5::de::Parser as pest::parser::Parser<json5::de::Rule>>::parse::rules::visible::WHITESPACE (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::atomic (1 samples, 0.05%)arvz`pest::parser_state::ParserState<R>::inc_call_check_limit (1 samples, 0.05%)arvz`pest::parser_state::CallLimitTracker::limit_reached (1 samples, 0.05%)arvz`core::option::Option<T>::map_or (1 samples, 0.05%)arvz`<reqwest::async_impl::client::Pending as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<reqwest::async_impl::client::PendingRequest as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<hyper::client::client::ResponseFuture as core::future::future::Future>::poll (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::retryably_send_request::_{{closure}} (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::send_request::_{{closure}} (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::connection_for::_{{closure}} (1 samples, 0.05%)arvz`<futures_util::future::select::Select<A,B> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`futures_util::future::future::FutureExt::poll_unpin (1 samples, 0.05%)arvz`<hyper::common::lazy::Lazy<F,R> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::either::Either<A,B> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::AndThen<Fut1,Fut2,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::TryFlatten<Fut1,Fut2> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::try_flatten::TryFlatten<Fut,<Fut as futures_core::future::TryFuture>::Ok> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::MapOk<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::MapErr<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<hyper::service::oneshot::Oneshot<S,Req> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<core::pin::Pin<P> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`reqwest::connect::with_timeout::_{{closure}} (1 samples, 0.05%)arvz`reqwest::connect::Connector::connect_with_maybe_proxy::_{{closure}} (1 samples, 0.05%)arvz`<hyper_tls::client::HttpsConnecting<T> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<core::pin::Pin<P> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<hyper_tls::client::HttpsConnector<T> as tower_service::Service<http::uri::Uri>>::call::_{{closure}} (1 samples, 0.05%)arvz`tokio_native_tls::TlsConnector::connect::_{{closure}} (1 samples, 0.05%)arvz`tokio_native_tls::handshake::_{{closure}} (1 samples, 0.05%)arvz`<tokio_native_tls::StartedHandshakeFuture<F,S> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`tokio_native_tls::TlsConnector::connect::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`native_tls::TlsConnector::connect (1 samples, 0.05%)arvz`native_tls::imp::TlsConnector::connect (1 samples, 0.05%)arvz`security_framework::secure_transport::ClientBuilder::handshake (1 samples, 0.05%)arvz`security_framework::secure_transport::MidHandshakeClientBuilder<S>::handshake (1 samples, 0.05%)arvz`security_framework::secure_transport::SslStream<S>::handshake (1 samples, 0.05%)Security`SSLHandshake (1 samples, 0.05%)Security`SSLHandshakeProceed (1 samples, 0.05%)Security`SSLRecordReadInternal (1 samples, 0.05%)arvz`security_framework::secure_transport::read_func (1 samples, 0.05%)arvz`std::panicking::try (1 samples, 0.05%)arvz`core::ops::function::FnOnce::call_once{{vtable.shim}} (2 samples, 0.10%)arvz`std::thread::Builder::spawn_unchecked_::_{{closure}} (2 samples, 0.10%)arvz`std::panicking::try (2 samples, 0.10%)arvz`__rust_try (2 samples, 0.10%)arvz`std::panicking::try::do_call (2 samples, 0.10%)arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (2 samples, 0.10%)arvz`std::thread::Builder::spawn_unchecked_::_{{closure}}::_{{closure}} (2 samples, 0.10%)arvz`std::sys_common::backtrace::__rust_begin_short_backtrace (2 samples, 0.10%)arvz`tokio::runtime::blocking::pool::Spawner::spawn_thread::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::blocking::pool::Inner::run (2 samples, 0.10%)arvz`tokio::runtime::blocking::pool::Task::run (2 samples, 0.10%)arvz`tokio::runtime::task::UnownedTask<S>::run (2 samples, 0.10%)arvz`tokio::runtime::task::raw::RawTask::poll (2 samples, 0.10%)arvz`tokio::runtime::task::raw::poll (2 samples, 0.10%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll (2 samples, 0.10%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll_inner (2 samples, 0.10%)arvz`tokio::runtime::task::harness::poll_future (2 samples, 0.10%)arvz`std::panic::catch_unwind (2 samples, 0.10%)arvz`std::panicking::try (2 samples, 0.10%)arvz`__rust_try (2 samples, 0.10%)arvz`std::panicking::try::do_call (2 samples, 0.10%)arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (2 samples, 0.10%)arvz`tokio::runtime::task::harness::poll_future::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::task::core::Core<T,S>::poll (2 samples, 0.10%)arvz`tokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (2 samples, 0.10%)arvz`<tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::Launch::launch::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::run (2 samples, 0.10%)arvz`tokio::runtime::context::runtime::enter_runtime (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::context::set_scheduler (2 samples, 0.10%)arvz`std::thread::local::LocalKey<T>::with (2 samples, 0.10%)arvz`std::thread::local::LocalKey<T>::try_with (2 samples, 0.10%)arvz`tokio::runtime::context::set_scheduler::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::context::scoped::Scoped<T>::set (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}}::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run_task (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run_task::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::task::LocalNotified<S>::run (2 samples, 0.10%)arvz`tokio::runtime::task::raw::RawTask::poll (2 samples, 0.10%)arvz`tokio::runtime::task::raw::poll (2 samples, 0.10%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll (2 samples, 0.10%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll_inner (2 samples, 0.10%)arvz`tokio::runtime::task::harness::poll_future (2 samples, 0.10%)arvz`std::panic::catch_unwind (2 samples, 0.10%)arvz`std::panicking::try (2 samples, 0.10%)arvz`__rust_try (2 samples, 0.10%)arvz`std::panicking::try::do_call (2 samples, 0.10%)arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (2 samples, 0.10%)arvz`tokio::runtime::task::harness::poll_future::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::task::core::Core<T,S>::poll (2 samples, 0.10%)arvz`tokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (2 samples, 0.10%)arvz`arvz::app::App::run::_{{closure}}::_{{closure}} (2 samples, 0.10%)arvz`arvz::context_data::ContextData::refresh::_{{closure}} (2 samples, 0.10%)arvz`reqwest::async_impl::response::Response::text::_{{closure}} (1 samples, 0.05%)arvz`reqwest::async_impl::response::Response::text_with_charset::_{{closure}} (1 samples, 0.05%)arvz`reqwest::async_impl::response::Response::bytes::_{{closure}} (1 samples, 0.05%)arvz`hyper::body::to_bytes::to_bytes::_{{closure}} (1 samples, 0.05%)arvz`<http_body::next::Data<T> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<&mut T as http_body::Body>::poll_data (1 samples, 0.05%)arvz`<core::pin::Pin<P> as http_body::Body>::poll_data (1 samples, 0.05%)arvz`<reqwest::async_impl::decoder::Decoder as http_body::Body>::poll_data (1 samples, 0.05%)arvz`<reqwest::async_impl::decoder::Decoder as futures_core::stream::Stream>::poll_next (1 samples, 0.05%)arvz`<reqwest::async_impl::body::ImplStream as futures_core::stream::Stream>::poll_next (1 samples, 0.05%)arvz`<reqwest::async_impl::body::ImplStream as http_body::Body>::poll_data (1 samples, 0.05%)arvz`<core::pin::Pin<P> as http_body::Body>::poll_data (1 samples, 0.05%)arvz`<reqwest::async_impl::body::WrapHyper as http_body::Body>::poll_data (1 samples, 0.05%)arvz`<hyper::body::body::Body as http_body::Body>::poll_data (1 samples, 0.05%)arvz`hyper::body::body::Body::poll_eof (1 samples, 0.05%)arvz`hyper::body::body::Body::poll_inner (1 samples, 0.05%)arvz`<futures_channel::mpsc::Receiver<T> as futures_core::stream::Stream>::poll_next (1 samples, 0.05%)arvz`futures_channel::mpsc::Receiver<T>::next_message (1 samples, 0.05%)arvz`futures_channel::mpsc::Receiver<T>::unpark_one (1 samples, 0.05%)arvz`futures_channel::mpsc::SenderTask::notify (1 samples, 0.05%)arvz`core::task::wake::Waker::wake (1 samples, 0.05%)arvz`tokio::runtime::task::waker::wake_by_val (1 samples, 0.05%)arvz`tokio::runtime::task::harness::_<impl tokio::runtime::task::raw::RawTask>::wake_by_val (1 samples, 0.05%)arvz`tokio::runtime::task::raw::RawTask::schedule (1 samples, 0.05%)arvz`tokio::runtime::task::raw::schedule (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::task::Schedule for alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle>>::schedule (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::with_current (1 samples, 0.05%)arvz`tokio::runtime::context::with_scheduler (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::try_with (1 samples, 0.05%)arvz`tokio::runtime::context::with_scheduler::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::context::scoped::Scoped<T>::with (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::with_current::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_local (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::notify_parked_local (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::park::Unparker::unpark (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::park::Inner::unpark (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::park::Inner::unpark_condvar (1 samples, 0.05%)arvz`tokio::loom::std::parking_lot::Condvar::notify_one (1 samples, 0.05%)arvz`parking_lot::condvar::Condvar::notify_one (1 samples, 0.05%)arvz`parking_lot::condvar::Condvar::notify_one_slow (1 samples, 0.05%)arvz`parking_lot_core::parking_lot::unpark_requeue (1 samples, 0.05%)arvz`<parking_lot_core::thread_parker::imp::UnparkHandle as parking_lot_core::thread_parker::UnparkHandleT>::unpark (1 samples, 0.05%)libsystem_kernel.dylib`__psynch_cvsignal (1 samples, 0.05%)arvz`std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.05%)arvz`core::ops::function::FnOnce::call_once (1 samples, 0.05%)arvz`arvz::main (1 samples, 0.05%)arvz`tokio::runtime::runtime::Runtime::block_on (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::MultiThread::block_on (1 samples, 0.05%)arvz`tokio::runtime::context::runtime::enter_runtime (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::MultiThread::block_on::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::context::blocking::BlockingRegionGuard::block_on (1 samples, 0.05%)arvz`tokio::runtime::park::CachedParkThread::block_on (1 samples, 0.05%)arvz`tokio::runtime::park::CachedParkThread::block_on::_{{closure}} (1 samples, 0.05%)arvz`arvz::main::_{{closure}} (1 samples, 0.05%)arvz`arvz::tokio_main::_{{closure}} (1 samples, 0.05%)arvz`arvz::utils::initialize_logging (1 samples, 0.05%)arvz`tracing_subscriber::filter::env::EnvFilter::from_default_env (1 samples, 0.05%)arvz`tracing_subscriber::filter::env::builder::Builder::from_env_lossy (1 samples, 0.05%)arvz`tracing_subscriber::filter::env::builder::Builder::parse_lossy (1 samples, 0.05%)arvz`tracing_subscriber::filter::env::builder::Builder::from_directives (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::collect (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (1 samples, 0.05%)arvz`<core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::find_map (1 samples, 0.05%)arvz`<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::try_fold (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::try_fold (1 samples, 0.05%)arvz`core::iter::adapters::filter::filter_try_fold::_{{closure}} (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::find_map::check::_{{closure}} (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnMut<A> for &mut F>::call_mut (1 samples, 0.05%)arvz`tracing_subscriber::filter::env::builder::Builder::parse_lossy::_{{closure}} (1 samples, 0.05%)arvz`tracing_subscriber::filter::env::directive::Directive::parse (1 samples, 0.05%)arvz`<once_cell::sync::Lazy<T,F> as core::ops::deref::Deref>::deref (1 samples, 0.05%)arvz`once_cell::sync::Lazy<T,F>::force (1 samples, 0.05%)arvz`once_cell::sync::OnceCell<T>::get_or_init (1 samples, 0.05%)arvz`once_cell::sync::OnceCell<T>::get_or_try_init (1 samples, 0.05%)arvz`once_cell::imp::OnceCell<T>::initialize (1 samples, 0.05%)arvz`once_cell::imp::initialize_or_wait (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnMut<A> for &mut F>::call_mut (1 samples, 0.05%)arvz`once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.05%)arvz`once_cell::sync::OnceCell<T>::get_or_init::_{{closure}} (1 samples, 0.05%)arvz`once_cell::sync::Lazy<T,F>::force::_{{closure}} (1 samples, 0.05%)arvz`core::ops::function::FnOnce::call_once (1 samples, 0.05%)arvz`core::ops::function::FnOnce::call_once (1 samples, 0.05%)arvz`tracing_subscriber::filter::env::directive::Directive::parse::DIRECTIVE_RE::_{{closure}} (1 samples, 0.05%)arvz`regex::regex::string::Regex::new (1 samples, 0.05%)arvz`regex::builders::string::RegexBuilder::build (1 samples, 0.05%)arvz`regex::builders::Builder::build_one_string (1 samples, 0.05%)arvz`regex_automata::meta::regex::Builder::build (1 samples, 0.05%)arvz`regex_automata::meta::regex::Builder::build_many (1 samples, 0.05%)arvz`regex_automata::meta::regex::Builder::build_many_from_hir (1 samples, 0.05%)arvz`regex_automata::meta::strategy::new (1 samples, 0.05%)arvz`regex_automata::meta::strategy::Core::new (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::compile (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::compile::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_concat (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_slice (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_slice::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_concat (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_repetition (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_bounded (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_exactly (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_concat (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_exactly::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_slice (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_slice::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_repetition (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_at_least (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_unicode_class (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::zip (1 samples, 0.05%)arvz`<core::iter::adapters::zip::Zip<A,B> as core::iter::adapters::zip::ZipImpl<A,B>>::new (1 samples, 0.05%)arvz`core::iter::adapters::zip::TrustedRandomAccessNoCoerce::size (1 samples, 0.05%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::size_hint (1 samples, 0.05%)arvz`tokio::runtime::blocking::pool::Inner::run (1 samples, 0.05%)arvz`tokio::runtime::blocking::pool::Task::run (1 samples, 0.05%)arvz`tokio::runtime::task::UnownedTask<S>::run (1 samples, 0.05%)arvz`tokio::runtime::task::raw::RawTask::poll (1 samples, 0.05%)arvz`tokio::runtime::task::raw::poll (1 samples, 0.05%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll (1 samples, 0.05%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll_inner (1 samples, 0.05%)arvz`tokio::runtime::task::harness::poll_future (1 samples, 0.05%)arvz`std::panic::catch_unwind (1 samples, 0.05%)arvz`std::panicking::try (1 samples, 0.05%)arvz`__rust_try (1 samples, 0.05%)arvz`std::panicking::try::do_call (1 samples, 0.05%)arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (1 samples, 0.05%)arvz`tokio::runtime::task::harness::poll_future::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::task::core::Core<T,S>::poll (1 samples, 0.05%)arvz`tokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (1 samples, 0.05%)arvz`<tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Launch::launch::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::run (1 samples, 0.05%)arvz`tokio::runtime::context::runtime::enter_runtime (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::context::set_scheduler (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::with (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::try_with (1 samples, 0.05%)arvz`tokio::runtime::context::set_scheduler::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::context::scoped::Scoped<T>::set (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run_task (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run_task::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::task::LocalNotified<S>::run (1 samples, 0.05%)arvz`tokio::runtime::task::raw::RawTask::poll (1 samples, 0.05%)arvz`tokio::runtime::task::raw::poll (1 samples, 0.05%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll (1 samples, 0.05%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll_inner (1 samples, 0.05%)arvz`tokio::runtime::task::harness::poll_future (1 samples, 0.05%)arvz`std::panic::catch_unwind (1 samples, 0.05%)arvz`std::panicking::try (1 samples, 0.05%)arvz`__rust_try (1 samples, 0.05%)arvz`std::panicking::try::do_call (1 samples, 0.05%)arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (1 samples, 0.05%)arvz`tokio::runtime::task::harness::poll_future::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::task::core::Core<T,S>::poll (1 samples, 0.05%)arvz`tokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (1 samples, 0.05%)arvz`arvz::app::App::run::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`arvz::context_data::ContextData::refresh::_{{closure}} (1 samples, 0.05%)arvz`<reqwest::async_impl::client::Pending as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<reqwest::async_impl::client::PendingRequest as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<hyper::client::client::ResponseFuture as core::future::future::Future>::poll (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::retryably_send_request::_{{closure}} (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::send_request::_{{closure}} (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::connection_for::_{{closure}} (1 samples, 0.05%)arvz`<futures_util::future::select::Select<A,B> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`futures_util::future::future::FutureExt::poll_unpin (1 samples, 0.05%)arvz`<hyper::common::lazy::Lazy<F,R> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::either::Either<A,B> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::AndThen<Fut1,Fut2,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::TryFlatten<Fut1,Fut2> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::try_flatten::TryFlatten<Fut,<Fut as futures_core::future::TryFuture>::Ok> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::MapOk<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::MapErr<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<hyper::service::oneshot::Oneshot<S,Req> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<core::pin::Pin<P> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`reqwest::connect::with_timeout::_{{closure}} (1 samples, 0.05%)arvz`reqwest::connect::Connector::connect_with_maybe_proxy::_{{closure}} (1 samples, 0.05%)arvz`<hyper_tls::client::HttpsConnecting<T> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<core::pin::Pin<P> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<hyper_tls::client::HttpsConnector<T> as tower_service::Service<http::uri::Uri>>::call::_{{closure}} (1 samples, 0.05%)arvz`tokio_native_tls::TlsConnector::connect::_{{closure}} (1 samples, 0.05%)arvz`tokio_native_tls::handshake::_{{closure}} (1 samples, 0.05%)arvz`<tokio_native_tls::MidHandshake<S> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`native_tls::MidHandshakeTlsStream<S>::handshake (1 samples, 0.05%)arvz`native_tls::imp::MidHandshakeTlsStream<S>::handshake (1 samples, 0.05%)arvz`security_framework::secure_transport::MidHandshakeClientBuilder<S>::handshake (1 samples, 0.05%)arvz`security_framework::secure_transport::SslStream<S>::handshake (1 samples, 0.05%)Security`SSLHandshake (1 samples, 0.05%)Security`SSLHandshakeProceed (1 samples, 0.05%)libcoretls.dylib`tls_handshake_continue (1 samples, 0.05%)libcoretls.dylib`SSLAdvanceHandshake (1 samples, 0.05%)libcoretls.dylib`SSLPrepareAndQueueMessage (1 samples, 0.05%)libcoretls.dylib`SSLEncodeKeyExchange (1 samples, 0.05%)libcoretls.dylib`sslEcdhCreateKey (1 samples, 0.05%)libcorecrypto.dylib`ccec_generate_key (1 samples, 0.05%)libcorecrypto.dylib`ccec_generate_key_fips (1 samples, 0.05%)libcorecrypto.dylib`ccec_generate_key_fips_ws (1 samples, 0.05%)libcorecrypto.dylib`ccec_pairwise_consistency_check_ws (1 samples, 0.05%)libcorecrypto.dylib`ccec_sign_internal_ws (1 samples, 0.05%)libcorecrypto.dylib`ccec_sign_internal_inner_ws (1 samples, 0.05%)libcorecrypto.dylib`ccec_mult_blinded_ws (1 samples, 0.05%)libcorecrypto.dylib`ccec_mult_default_ws (1 samples, 0.05%)libcorecrypto.dylib`ccn_cond_swap (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Launch::launch::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::run (1 samples, 0.05%)arvz`tokio::runtime::context::runtime::enter_runtime (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::context::set_scheduler (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::with (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::try_with (1 samples, 0.05%)arvz`tokio::runtime::context::set_scheduler::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::context::scoped::Scoped<T>::set (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run_task (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run_task::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::task::LocalNotified<S>::run (1 samples, 0.05%)arvz`tokio::runtime::task::raw::RawTask::poll (1 samples, 0.05%)arvz`tokio::runtime::task::raw::poll (1 samples, 0.05%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll (1 samples, 0.05%)arvz`tokio::runtime::task::harness::Harness<T,S>::poll_inner (1 samples, 0.05%)arvz`tokio::runtime::task::harness::poll_future (1 samples, 0.05%)arvz`std::panic::catch_unwind (1 samples, 0.05%)arvz`std::panicking::try (1 samples, 0.05%)arvz`__rust_try (1 samples, 0.05%)arvz`std::panicking::try::do_call (1 samples, 0.05%)arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (1 samples, 0.05%)arvz`tokio::runtime::task::harness::poll_future::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::task::core::Core<T,S>::poll (1 samples, 0.05%)arvz`tokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (1 samples, 0.05%)arvz`arvz::app::App::run::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`arvz::context_data::ContextData::refresh::_{{closure}} (1 samples, 0.05%)arvz`<reqwest::async_impl::client::Pending as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<reqwest::async_impl::client::PendingRequest as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<hyper::client::client::ResponseFuture as core::future::future::Future>::poll (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::retryably_send_request::_{{closure}} (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::send_request::_{{closure}} (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::connection_for::_{{closure}} (1 samples, 0.05%)arvz`<futures_util::future::select::Select<A,B> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`futures_util::future::future::FutureExt::poll_unpin (1 samples, 0.05%)arvz`<hyper::common::lazy::Lazy<F,R> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::either::Either<A,B> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::AndThen<Fut1,Fut2,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::TryFlatten<Fut1,Fut2> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::try_flatten::TryFlatten<Fut,<Fut as futures_core::future::TryFuture>::Ok> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::MapOk<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::MapErr<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<hyper::service::oneshot::Oneshot<S,Req> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<core::pin::Pin<P> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`reqwest::connect::with_timeout::_{{closure}} (1 samples, 0.05%)arvz`reqwest::connect::Connector::connect_with_maybe_proxy::_{{closure}} (1 samples, 0.05%)arvz`<hyper_tls::client::HttpsConnecting<T> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<core::pin::Pin<P> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<hyper_tls::client::HttpsConnector<T> as tower_service::Service<http::uri::Uri>>::call::_{{closure}} (1 samples, 0.05%)arvz`tokio_native_tls::TlsConnector::connect::_{{closure}} (1 samples, 0.05%)arvz`tokio_native_tls::handshake::_{{closure}} (1 samples, 0.05%)arvz`<tokio_native_tls::MidHandshake<S> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`native_tls::MidHandshakeTlsStream<S>::handshake (1 samples, 0.05%)arvz`native_tls::imp::MidHandshakeTlsStream<S>::handshake (1 samples, 0.05%)arvz`security_framework::secure_transport::MidHandshakeClientBuilder<S>::handshake (1 samples, 0.05%)arvz`security_framework::secure_transport::SslStream<S>::handshake (1 samples, 0.05%)Security`SSLHandshake (1 samples, 0.05%)Security`SSLHandshakeProceed (1 samples, 0.05%)libcoretls.dylib`tls_handshake_process (1 samples, 0.05%)libcoretls.dylib`SSLProcessHandshakeRecordInner (1 samples, 0.05%)Security`tls_handshake_message_callback (1 samples, 0.05%)libcoretls_cfhelpers.dylib`tls_helper_set_peer_pubkey (1 samples, 0.05%)Security`SecTrustCopyPublicKey (1 samples, 0.05%)Security`SecCertificateCopyPublicKey$LEGACYMAC (1 samples, 0.05%)Security`Security::KeychainCore::Certificate::publicKey (1 samples, 0.05%)Security`Security::KeychainCore::Certificate::copyFirstFieldValue (1 samples, 0.05%)Security`Security::KeychainCore::Certificate::clHandle (1 samples, 0.05%)Security`Security::CssmClient::AttachmentImpl::activate (1 samples, 0.05%)Security`Security::CssmClient::ModuleImpl::activate (1 samples, 0.05%)Security`CSSM_ModuleLoad (1 samples, 0.05%)Security`Security::CssmClient::Table<Security::MDSClient::Common>::fetch (1 samples, 0.05%)Security`Security::CssmClient::Table<Security::MDSClient::Common>::startQuery (1 samples, 0.05%)Security`Security::MDSClient::Directory::dlGetFirst (1 samples, 0.05%)Security`Security::MDSClient::Directory::cdsa (1 samples, 0.05%)Security`mds_DbOpen(long, char const*, cssm_net_address const*, unsigned int, cssm_access_credentials const*, void const*, long*) (1 samples, 0.05%)Security`Security::MDSSession::DbOpen (1 samples, 0.05%)Security`Security::MDSSession::updateDataBases (1 samples, 0.05%)Security`Security::MDSSession::DbFilesInfo::updateForBundleDir (1 samples, 0.05%)Security`Security::MDSSession::DbFilesInfo::updateForBundle (1 samples, 0.05%)Security`Security::MDSAttrParser::parseAttrs (1 samples, 0.05%)CoreFoundation`CFBundleCopyResourceURLsOfType (1 samples, 0.05%)CoreFoundation`_CFBundleCopyFindResources (1 samples, 0.05%)CoreFoundation`_copyResourceURLsFromBundle (1 samples, 0.05%)CoreFoundation`_copyQueryTable (1 samples, 0.05%)CoreFoundation`_createQueryTableAtPath (1 samples, 0.05%)CoreFoundation`_CFBundleReadDirectory (1 samples, 0.05%)CoreFoundation`_CFIterateDirectory (1 samples, 0.05%)libsystem_c.dylib`readdir (1 samples, 0.05%)libsystem_kernel.dylib`__getdirentries64 (1 samples, 0.05%)arvz`tokio::runtime::builder::Builder::build (1 samples, 0.05%)arvz`tokio::runtime::builder::Builder::build_threaded_runtime (1 samples, 0.05%)arvz`tokio::runtime::handle::Handle::enter (1 samples, 0.05%)arvz`tokio::runtime::context::current::try_set_current (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::try_with (1 samples, 0.05%)arvz`<&mut T as core::ops::deref::DerefMut>::deref_mut (1 samples, 0.05%)arvz`arvz::config::Config::new (1 samples, 0.05%)arvz`config::builder::ConfigBuilder<config::builder::DefaultState>::build (1 samples, 0.05%)arvz`config::builder::ConfigBuilder<config::builder::DefaultState>::build_internal (1 samples, 0.05%)arvz`config::source::Source::collect_to (1 samples, 0.05%)arvz`<[alloc::boxed::Box<dyn config::source::Source+core::marker::Sync+core::marker::Send>] as config::source::Source>::collect (1 samples, 0.05%)arvz`config::source::Source::collect_to (1 samples, 0.05%)arvz`<config::file::File<T,F> as config::source::Source>::collect (1 samples, 0.05%)arvz`<config::file::source::file::FileSourceFile as config::file::source::FileSource<F>>::resolve (1 samples, 0.05%)arvz`config::file::source::file::FileSourceFile::find_file (1 samples, 0.05%)arvz`<T as core::convert::Into<U>>::into (1 samples, 0.05%)arvz`arvz::app::App::new::_{{closure}} (2 samples, 0.10%)arvz`reqwest::async_impl::client::Client::new (1 samples, 0.05%)arvz`<reqwest::async_impl::decoder::Accepts as core::default::Default>::default (1 samples, 0.05%)arvz`arvz::components::LinkedComponent::handle_events (1 samples, 0.05%)arvz`arvz::components::Component::handle_events (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_constraint (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::create_row (1 samples, 0.05%)arvz`cassowary::Row::insert_row (1 samples, 0.05%)arvz`<std::collections::hash::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<hashbrown::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<hashbrown::raw::RawIter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`hashbrown::raw::RawIterRange<T>::next_impl (1 samples, 0.05%)arvz`hashbrown::raw::neon::Group::match_full (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_with_artificial_variable (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::optimise (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::substitute (1 samples, 0.05%)arvz`cassowary::Row::substitute (1 samples, 0.05%)arvz`cassowary::Row::insert_row (1 samples, 0.05%)arvz`cassowary::Row::insert_symbol (1 samples, 0.05%)arvz`std::collections::hash::map::HashMap<K,V,S>::entry (1 samples, 0.05%)arvz`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (1 samples, 0.05%)arvz`<hashbrown::raw::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`arvz::main_layout::MainLayout::set_main_layout (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::split (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::split_with_spacers (3 samples, 0.15%)arvz`std::thread::local::LocalKey<T>::with (3 samples, 0.15%)arvz`std::thread::local::LocalKey<T>::try_with (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::split_with_spacers::_{{closure}} (3 samples, 0.15%)arvz`lru::LruCache<K,V,S>::get_or_insert (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::split_with_spacers::_{{closure}}::_{{closure}} (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::try_split (3 samples, 0.15%)arvz`ratatui::layout::layout::configure_variable_constraints (2 samples, 0.10%)arvz`cassowary::solver_impl::Solver::add_constraint (2 samples, 0.10%)arvz`std::collections::hash::map::HashMap<K,V,S>::contains_key (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::contains_key (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::get (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::find (1 samples, 0.05%)arvz`<ratatui::backend::crossterm::CrosstermBackend<W> as ratatui::backend::Backend>::draw (1 samples, 0.05%)arvz`<ratatui::style::color::Color as core::cmp::PartialEq>::eq (1 samples, 0.05%)arvz`core::cmp::impls::_<impl core::cmp::PartialEq<&B> for &A>::ne (1 samples, 0.05%)arvz`core::cmp::PartialEq::ne (1 samples, 0.05%)arvz`<ratatui::buffer::cell::Cell as core::cmp::PartialEq>::eq (1 samples, 0.05%)arvz`<compact_str::CompactString as core::cmp::PartialEq<T>>::eq (1 samples, 0.05%)arvz`compact_str::CompactString::as_str (1 samples, 0.05%)arvz`compact_str::repr::Repr::as_str (1 samples, 0.05%)arvz`core::slice::raw::from_raw_parts (1 samples, 0.05%)arvz`arvz::tui::Tui::exit (4 samples, 0.20%)arvz`ratatui::terminal::terminal::Terminal<B>::flush (4 samples, 0.20%)arvz`ratatui::buffer::buffer::Buffer::diff (3 samples, 0.15%)arvz`core::str::_<impl str>::chars (1 samples, 0.05%)arvz`arvz::tui::Tui::new (1 samples, 0.05%)arvz`ratatui::terminal::terminal::Terminal<B>::new (1 samples, 0.05%)arvz`ratatui::terminal::terminal::Terminal<B>::with_options (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::empty (1 samples, 0.05%)arvz`alloc::vec::Vec<T,A>::push (1 samples, 0.05%)arvz`arvz::tui::Tui::next::_{{closure}} (1 samples, 0.05%)arvz`tokio::sync::mpsc::unbounded::UnboundedReceiver<T>::recv::_{{closure}} (1 samples, 0.05%)arvz`<tokio::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`tokio::sync::mpsc::unbounded::UnboundedReceiver<T>::recv::_{{closure}}::_{{closure}} (1 samples, 0.05%)arvz`tokio::sync::mpsc::unbounded::UnboundedReceiver<T>::poll_recv (1 samples, 0.05%)arvz`tokio::sync::mpsc::chan::Rx<T,S>::recv (1 samples, 0.05%)arvz`tokio::sync::mpsc::chan::Rx<T,S>::recv::_{{closure}} (1 samples, 0.05%)arvz`tokio::sync::mpsc::list::Rx<T>::pop (1 samples, 0.05%)arvz`tokio::sync::mpsc::block::Block<T>::read (1 samples, 0.05%)arvz`core::array::_<impl core::ops::index::Index<I> for [T (1 samples, 0.05%) N]>::index (1 samples, 0.05%)arvz`core::array::_<impl core::iter::traits::collect::IntoIterator for &[T (1 samples, 0.05%) N]>::into_iter (1 samples, 0.05%)arvz`<core::option::Option<W> as ratatui::widgets::WidgetRef>::render_ref (1 samples, 0.05%)arvz`<ratatui::widgets::block::Block as ratatui::widgets::WidgetRef>::render_ref (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::bottom (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (1 samples, 0.05%)arvz`ratatui::buffer::cell::Cell::set_style (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::insert (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::union (1 samples, 0.05%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<unicode_segmentation::grapheme::Graphemes as core::iter::traits::iterator::Iterator>::next (2 samples, 0.10%)arvz`core::str::traits::_<impl core::ops::index::Index<I> for str>::index (2 samples, 0.10%)arvz`core::str::traits::_<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index (1 samples, 0.05%)arvz`core::str::traits::_<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::get (1 samples, 0.05%)arvz`<&mut I as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`<core::iter::adapters::flatten::FlatMap<I,U,F> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`<core::iter::adapters::flatten::FlattenCompat<I,U> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`core::iter::adapters::flatten::and_then_or_clear (5 samples, 0.25%)arvz`core::ops::function::FnOnce::call_once (5 samples, 0.25%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`core::iter::traits::iterator::Iterator::find (5 samples, 0.25%)arvz`core::iter::traits::iterator::Iterator::try_fold (5 samples, 0.25%)arvz`core::iter::traits::iterator::Iterator::find::check::_{{closure}} (2 samples, 0.10%)arvz`core::ops::function::impls::_<impl core::ops::function::FnMut<A> for &mut F>::call_mut (1 samples, 0.05%)arvz`ratatui::text::span::Span::styled_graphemes::_{{closure}} (1 samples, 0.05%)arvz`core::cmp::impls::_<impl core::cmp::PartialEq<&B> for &A>::ne (1 samples, 0.05%)arvz`core::cmp::PartialEq::ne (1 samples, 0.05%)arvz`core::str::traits::_<impl core::cmp::PartialEq for str>::eq (1 samples, 0.05%)arvz`<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width (2 samples, 0.10%)arvz`core::iter::traits::iterator::Iterator::sum (2 samples, 0.10%)arvz`<usize as core::iter::traits::accum::Sum>::sum (2 samples, 0.10%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.10%)arvz`core::iter::traits::iterator::Iterator::fold (2 samples, 0.10%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (2 samples, 0.10%)arvz`core::str::validations::next_code_point (2 samples, 0.10%)arvz`<ratatui::widgets::reflow::LineTruncator<O,I> as ratatui::widgets::reflow::LineComposer>::next_line (9 samples, 0.45%)arvz`alloc::vec::Vec<T,A>::push (2 samples, 0.10%)arvz`alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.10%)arvz`alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 0.10%)arvz`alloc::raw_vec::finish_grow (2 samples, 0.10%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::grow (2 samples, 0.10%)arvz`alloc::alloc::Global::grow_impl (2 samples, 0.10%)libsystem_malloc.dylib`_realloc (1 samples, 0.05%)libsystem_malloc.dylib`_malloc_zone_realloc (1 samples, 0.05%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`ratatui::terminal::frame::Frame::render_widget (13 samples, 0.65%)arvz`<ratatui::widgets::paragraph::Paragraph as ratatui::widgets::Widget>::render (13 samples, 0.65%)arvz`<ratatui::widgets::paragraph::Paragraph as ratatui::widgets::WidgetRef>::render_ref (13 samples, 0.65%)arvz`ratatui::widgets::paragraph::Paragraph::render_paragraph (11 samples, 0.55%)arvz`ratatui::widgets::paragraph::Paragraph::render_text (10 samples, 0.50%)arvz`alloc::vec::Vec<T,A>::truncate (1 samples, 0.05%)arvz`<arvz::components::ascii::Ascii as arvz::components::Component>::draw (14 samples, 0.70%)arvz`ratatui::widgets::paragraph::Paragraph::new (1 samples, 0.05%)arvz`<T as core::convert::Into<U>>::into (1 samples, 0.05%)arvz`<ratatui::text::text::Text as core::convert::From<&str>>::from (1 samples, 0.05%)arvz`ratatui::text::text::Text::raw (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::collect (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.05%)arvz`alloc::vec::Vec<T,A>::extend_desugared (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::str::iter::Lines as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::str::iter::SplitInclusive<P> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::str::iter::SplitInternal<P>::next_inclusive (1 samples, 0.05%)arvz`<core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::get (1 samples, 0.05%)arvz`<T as core::convert::Into<U>>::into (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (1 samples, 0.05%)arvz`<core::option::Option<W> as ratatui::widgets::WidgetRef>::render_ref (2 samples, 0.10%)arvz`<ratatui::widgets::block::Block as ratatui::widgets::WidgetRef>::render_ref (2 samples, 0.10%)arvz`ratatui::buffer::buffer::Buffer::set_style (2 samples, 0.10%)arvz`ratatui::buffer::cell::Cell::set_style (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::insert (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (1 samples, 0.05%)arvz`ratatui::buffer::cell::Cell::set_style (1 samples, 0.05%)arvz`core::str::traits::_<impl core::ops::index::Index<I> for str>::index (2 samples, 0.10%)arvz`core::str::traits::_<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index (2 samples, 0.10%)arvz`core::str::_<impl str>::is_char_boundary (2 samples, 0.10%)arvz`<unicode_segmentation::grapheme::Graphemes as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`unicode_segmentation::grapheme::GraphemeCursor::next_boundary (3 samples, 0.15%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<&mut I as core::iter::traits::iterator::Iterator>::next (7 samples, 0.35%)arvz`<core::iter::adapters::flatten::FlatMap<I,U,F> as core::iter::traits::iterator::Iterator>::next (7 samples, 0.35%)arvz`<core::iter::adapters::flatten::FlattenCompat<I,U> as core::iter::traits::iterator::Iterator>::next (7 samples, 0.35%)arvz`core::iter::adapters::flatten::and_then_or_clear (7 samples, 0.35%)arvz`core::ops::function::FnOnce::call_once (7 samples, 0.35%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (6 samples, 0.30%)arvz`<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (6 samples, 0.30%)arvz`core::iter::traits::iterator::Iterator::find (6 samples, 0.30%)arvz`core::iter::traits::iterator::Iterator::try_fold (6 samples, 0.30%)arvz`core::iter::traits::iterator::Iterator::find::check::_{{closure}} (1 samples, 0.05%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (2 samples, 0.10%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width (4 samples, 0.20%)arvz`core::iter::traits::iterator::Iterator::sum (4 samples, 0.20%)arvz`<usize as core::iter::traits::accum::Sum>::sum (4 samples, 0.20%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (4 samples, 0.20%)arvz`core::iter::traits::iterator::Iterator::fold (4 samples, 0.20%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (2 samples, 0.10%)arvz`<usize as core::iter::traits::accum::Sum>::sum::_{{closure}} (1 samples, 0.05%)arvz`<ratatui::widgets::reflow::LineTruncator<O,I> as ratatui::widgets::reflow::LineComposer>::next_line (13 samples, 0.65%)arvz`core::iter::traits::iterator::Iterator::map (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::sum (1 samples, 0.05%)arvz`ratatui::buffer::cell::Cell::set_style (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::remove (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::difference (1 samples, 0.05%)arvz`<arvz::components::context_informations::ContextInformation as arvz::components::Component>::draw (22 samples, 1.10%)arvz`ratatui::terminal::frame::Frame::render_widget (21 samples, 1.05%)arvz`<ratatui::widgets::paragraph::Paragraph as ratatui::widgets::Widget>::render (21 samples, 1.05%)arvz`<ratatui::widgets::paragraph::Paragraph as ratatui::widgets::WidgetRef>::render_ref (21 samples, 1.05%)arvz`ratatui::widgets::paragraph::Paragraph::render_paragraph (18 samples, 0.90%)arvz`ratatui::widgets::paragraph::Paragraph::render_text (18 samples, 0.90%)arvz`ratatui::buffer::cell::Cell::set_symbol (3 samples, 0.15%)arvz`compact_str::CompactString::new (1 samples, 0.05%)arvz`compact_str::repr::Repr::new (1 samples, 0.05%)arvz`core::str::_<impl str>::len (1 samples, 0.05%)arvz`<arvz::components::status_bar::StatusBar as arvz::components::Component>::draw (1 samples, 0.05%)arvz`ratatui::terminal::frame::Frame::render_widget (1 samples, 0.05%)arvz`<ratatui::widgets::paragraph::Paragraph as ratatui::widgets::Widget>::render (1 samples, 0.05%)arvz`<ratatui::widgets::paragraph::Paragraph as ratatui::widgets::WidgetRef>::render_ref (1 samples, 0.05%)arvz`ratatui::widgets::paragraph::Paragraph::render_paragraph (1 samples, 0.05%)arvz`ratatui::widgets::paragraph::Paragraph::render_text (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (1 samples, 0.05%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index_mut (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.05%)arvz`alloc::raw_vec::finish_grow (3 samples, 0.15%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.05%)arvz`alloc::alloc::Global::alloc_impl (1 samples, 0.05%)arvz`<T as alloc::string::ToString>::to_string (6 samples, 0.30%)arvz`core::fmt::num::imp::_<impl core::fmt::Display for i32>::fmt (6 samples, 0.30%)arvz`<alloc::string::String as core::fmt::Write>::write_str (6 samples, 0.30%)arvz`alloc::vec::Vec<T,A>::extend_from_slice (6 samples, 0.30%)arvz`<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<&T,core::slice::iter::Iter<T>>>::spec_extend (6 samples, 0.30%)arvz`alloc::vec::Vec<T,A>::reserve (6 samples, 0.30%)arvz`alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (6 samples, 0.30%)arvz`alloc::raw_vec::RawVec<T,A>::grow_amortized (5 samples, 0.25%)arvz`core::alloc::layout::Layout::array::inner (2 samples, 0.10%)arvz`<bool as alloc::string::ToString>::to_string (1 samples, 0.05%)arvz`<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.05%)arvz`alloc::alloc::Global::alloc_impl (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.05%)arvz`alloc::vec::Vec<T,A>::extend_desugared (1 samples, 0.05%)arvz`<core::str::pattern::CharSearcher as core::str::pattern::Searcher>::next_match (1 samples, 0.05%)arvz`core::slice::memchr::memchr_naive (1 samples, 0.05%)arvz`<core::str::iter::SplitInclusive<P> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.20%)arvz`core::str::iter::SplitInternal<P>::next_inclusive (4 samples, 0.20%)arvz`core::str::iter::SplitInternal<P>::get_end (1 samples, 0.05%)arvz`<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.10%)arvz`<&str as core::str::pattern::Pattern>::strip_suffix_of (4 samples, 0.20%)arvz`core::slice::_<impl [T]>::ends_with (4 samples, 0.20%)libsystem_platform.dylib`_platform_memcmp (1 samples, 0.05%)arvz`<core::str::iter::Lines as core::iter::traits::iterator::Iterator>::next (9 samples, 0.45%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (9 samples, 0.45%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (5 samples, 0.25%)arvz`<core::str::LinesMap as core::ops::function::FnMut<(&str,)>>::call_mut (5 samples, 0.25%)arvz`<core::str::LinesMap as core::ops::function::Fn<(&str,)>>::call (5 samples, 0.25%)arvz`core::char::methods::encode_utf8_raw (1 samples, 0.05%)arvz`<ratatui::text::line::Line as core::default::Default>::default (1 samples, 0.05%)arvz`ratatui::style::Style::new (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<ratatui::text::line::Line as core::convert::From<alloc::vec::Vec<ratatui::text::span::Span>>>::from (3 samples, 0.15%)arvz`core::ptr::drop_in_place<ratatui::text::line::Line> (2 samples, 0.10%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::text::span::Span>> (2 samples, 0.10%)arvz`core::ptr::drop_in_place<[ratatui::text::span::Span]> (1 samples, 0.05%)arvz`<ratatui::text::line::Line as core::convert::From<alloc::string::String>>::from (4 samples, 0.20%)arvz`alloc::alloc::exchange_malloc (1 samples, 0.05%)libsystem_malloc.dylib`nanov2_malloc (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.05%)arvz`alloc::alloc::Global::alloc_impl (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (15 samples, 0.75%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (6 samples, 0.30%)arvz`ratatui::text::text::Text::raw::_{{closure}} (6 samples, 0.30%)arvz`alloc::str::_<impl alloc::borrow::ToOwned for str>::to_owned (2 samples, 0.10%)arvz`<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.10%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (2 samples, 0.10%)arvz`core::alloc::layout::Layout::array::inner (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::collect (19 samples, 0.95%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (19 samples, 0.95%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (19 samples, 0.95%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (19 samples, 0.95%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (3 samples, 0.15%)arvz`core::alloc::layout::Layout::array::inner (1 samples, 0.05%)arvz`core::ptr::drop_in_place<alloc::string::String> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<u8>> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<alloc::raw_vec::RawVec<u8>> (1 samples, 0.05%)arvz`<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.05%)libsystem_malloc.dylib`_nanov2_free (1 samples, 0.05%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (23 samples, 1.15%)arvz`core::ops::function::FnMut::call_mut (23 samples, 1.15%)arvz`<T as core::convert::Into<U>>::into (23 samples, 1.15%)arvz`<ratatui::widgets::table::cell::Cell as core::convert::From<T>>::from (23 samples, 1.15%)arvz`<T as core::convert::Into<U>>::into (23 samples, 1.15%)arvz`<ratatui::text::text::Text as core::convert::From<alloc::string::String>>::from (22 samples, 1.10%)arvz`ratatui::text::text::Text::raw (22 samples, 1.10%)arvz`core::str::_<impl str>::lines (1 samples, 0.05%)arvz`core::str::_<impl str>::split_inclusive (1 samples, 0.05%)arvz`<char as core::str::pattern::Pattern>::into_searcher (1 samples, 0.05%)arvz`core::char::methods::encode_utf8_raw (1 samples, 0.05%)arvz`alloc::vec::Vec<T,A>::extend_trusted (24 samples, 1.20%)arvz`core::iter::traits::iterator::Iterator::for_each (24 samples, 1.20%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (24 samples, 1.20%)arvz`core::iter::traits::iterator::Iterator::fold (24 samples, 1.20%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`<arvz::models::pool::PoolCollection as arvz::models::model_airflow::ModelAirflow>::get_rows (32 samples, 1.60%)arvz`ratatui::widgets::table::row::Row::new (25 samples, 1.25%)arvz`core::iter::traits::iterator::Iterator::collect (25 samples, 1.25%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (25 samples, 1.25%)arvz`alloc::vec::in_place_collect::_<impl alloc::vec::spec_from_iter::SpecFromIter<T,I> for alloc::vec::Vec<T>>::from_iter (25 samples, 1.25%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (25 samples, 1.25%)arvz`<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (25 samples, 1.25%)arvz`alloc::vec::Vec<T,A>::reserve (1 samples, 0.05%)arvz`<core::option::Option<T> as core::clone::Clone>::clone (1 samples, 0.05%)arvz`<str as alloc::string::ToString>::to_string (1 samples, 0.05%)arvz`<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.05%)arvz`core::alloc::layout::Layout::array::inner (1 samples, 0.05%)arvz`alloc::alloc::exchange_malloc (1 samples, 0.05%)arvz`alloc::alloc::Global::alloc_impl (1 samples, 0.05%)arvz`alloc::fmt::format (2 samples, 0.10%)arvz`core::option::Option<T>::map_or_else (2 samples, 0.10%)arvz`alloc::fmt::format::_{{closure}} (1 samples, 0.05%)arvz`alloc::fmt::format::format_inner (1 samples, 0.05%)arvz`core::fmt::write (1 samples, 0.05%)arvz`core::fmt::float::float_to_decimal_common_exact (1 samples, 0.05%)arvz`core::num::flt2dec::strategy::grisu::format_exact_opt (1 samples, 0.05%)arvz`alloc::vec::Vec<T,A>::push (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.05%)arvz`alloc::raw_vec::finish_grow (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.05%)arvz`arvz::style::row::get_style_row (1 samples, 0.05%)arvz`core::str::traits::_<impl core::cmp::PartialEq for str>::eq (1 samples, 0.05%)arvz`<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.05%)arvz`<ratatui::widgets::table::row::Row as core::default::Default>::default (1 samples, 0.05%)arvz`<ratatui::style::Style as core::default::Default>::default (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::empty (1 samples, 0.05%)arvz`<ratatui::text::text::Text as core::convert::From<alloc::vec::Vec<ratatui::text::line::Line>>>::from (3 samples, 0.15%)arvz`core::ptr::drop_in_place<ratatui::text::text::Text> (2 samples, 0.10%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::text::line::Line>> (2 samples, 0.10%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (2 samples, 0.10%)arvz`<I as core::iter::traits::collect::IntoIterator>::into_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.05%)arvz`alloc::vec::Vec<T,A>::extend_desugared (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::str::iter::Lines as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::str::pattern::CharSearcher as core::str::pattern::Searcher>::next_match (1 samples, 0.05%)arvz`<core::str::iter::SplitInclusive<P> as core::iter::traits::iterator::Iterator>::next (6 samples, 0.30%)arvz`core::str::iter::SplitInternal<P>::next_inclusive (5 samples, 0.25%)arvz`core::str::iter::SplitInternal<P>::get_end (2 samples, 0.10%)arvz`<&str as core::str::pattern::Pattern>::strip_suffix_of (1 samples, 0.05%)arvz`core::slice::_<impl [T]>::ends_with (1 samples, 0.05%)arvz`core::char::methods::encode_utf8_raw (1 samples, 0.05%)arvz`<core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index_mut (1 samples, 0.05%)arvz`<core::str::iter::Lines as core::iter::traits::iterator::Iterator>::next (10 samples, 0.50%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (9 samples, 0.45%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (3 samples, 0.15%)arvz`<core::str::LinesMap as core::ops::function::FnMut<(&str,)>>::call_mut (3 samples, 0.15%)arvz`<core::str::LinesMap as core::ops::function::Fn<(&str,)>>::call (3 samples, 0.15%)arvz`core::slice::_<impl [T]>::ends_with (1 samples, 0.05%)arvz`<ratatui::text::line::Line as core::default::Default>::default (1 samples, 0.05%)arvz`<ratatui::style::Style as core::default::Default>::default (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::empty (1 samples, 0.05%)arvz`<ratatui::text::line::Line as core::convert::From<alloc::vec::Vec<ratatui::text::span::Span>>>::from (3 samples, 0.15%)arvz`core::ptr::drop_in_place<ratatui::text::line::Line> (2 samples, 0.10%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::text::span::Span>> (2 samples, 0.10%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (2 samples, 0.10%)arvz`alloc::alloc::exchange_malloc (1 samples, 0.05%)arvz`<ratatui::text::line::Line as core::convert::From<alloc::string::String>>::from (5 samples, 0.25%)arvz`alloc::slice::_<impl [T]>::into_vec (1 samples, 0.05%)arvz`<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 0.15%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (3 samples, 0.15%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.10%)arvz`alloc::alloc::Global::alloc_impl (2 samples, 0.10%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (22 samples, 1.10%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (11 samples, 0.55%)arvz`ratatui::text::text::Text::raw::_{{closure}} (9 samples, 0.45%)arvz`alloc::str::_<impl alloc::borrow::ToOwned for str>::to_owned (4 samples, 0.20%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::size_hint (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (27 samples, 1.35%)arvz`core::cmp::max_by (1 samples, 0.05%)arvz`core::cmp::impls::_<impl core::cmp::Ord for usize>::cmp (1 samples, 0.05%)arvz`DYLD-STUB$$memcpy (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::collect (30 samples, 1.50%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (30 samples, 1.50%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (29 samples, 1.45%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`core::ptr::drop_in_place<alloc::string::String> (2 samples, 0.10%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<u8>> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<alloc::raw_vec::RawVec<u8>> (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.05%)arvz`core::str::_<impl str>::split_inclusive (5 samples, 0.25%)arvz`<char as core::str::pattern::Pattern>::into_searcher (5 samples, 0.25%)arvz`core::char::methods::encode_utf8_raw (5 samples, 0.25%)arvz`<core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index_mut (2 samples, 0.10%)arvz`<arvz::models::tasks::Tasks as arvz::models::model_airflow::ModelAirflow>::get_rows (51 samples, 2.55%)ar..arvz`ratatui::widgets::table::row::Row::new (44 samples, 2.20%)a..arvz`core::iter::traits::iterator::Iterator::collect (43 samples, 2.15%)a..arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (43 samples, 2.15%)a..arvz`alloc::vec::in_place_collect::_<impl alloc::vec::spec_from_iter::SpecFromIter<T,I> for alloc::vec::Vec<T>>::from_iter (43 samples, 2.15%)a..arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (43 samples, 2.15%)a..arvz`<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (42 samples, 2.10%)a..arvz`alloc::vec::Vec<T,A>::extend_trusted (42 samples, 2.10%)a..arvz`core::iter::traits::iterator::Iterator::for_each (42 samples, 2.10%)a..arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (42 samples, 2.10%)a..arvz`core::iter::traits::iterator::Iterator::fold (42 samples, 2.10%)a..arvz`core::iter::adapters::map::map_fold::_{{closure}} (42 samples, 2.10%)a..arvz`core::ops::function::FnMut::call_mut (41 samples, 2.05%)a..arvz`<T as core::convert::Into<U>>::into (41 samples, 2.05%)a..arvz`<ratatui::widgets::table::cell::Cell as core::convert::From<T>>::from (41 samples, 2.05%)a..arvz`<T as core::convert::Into<U>>::into (41 samples, 2.05%)a..arvz`<ratatui::text::text::Text as core::convert::From<alloc::string::String>>::from (41 samples, 2.05%)a..arvz`ratatui::text::text::Text::raw (41 samples, 2.05%)a..arvz`core::str::_<impl str>::lines (6 samples, 0.30%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`alloc::fmt::format (1 samples, 0.05%)arvz`core::option::Option<T>::map_or_else (1 samples, 0.05%)arvz`core::ops::function::FnOnce::call_once (1 samples, 0.05%)arvz`alloc::str::_<impl alloc::borrow::ToOwned for str>::to_owned (1 samples, 0.05%)arvz`<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.05%)arvz`alloc::alloc::Global::alloc_impl (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::collect (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (1 samples, 0.05%)arvz`<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (5 samples, 0.25%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (8 samples, 0.40%)arvz`<u16 as core::iter::range::Step>::forward_unchecked (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (15 samples, 0.75%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index_mut (6 samples, 0.30%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index_mut (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::index_of (31 samples, 1.55%)arvz`ratatui::layout::rect::Rect::bottom (4 samples, 0.20%)arvz`ratatui::layout::rect::Rect::left (2 samples, 0.10%)arvz`ratatui::layout::rect::Rect::right (4 samples, 0.20%)arvz`ratatui::buffer::buffer::Buffer::get_mut (63 samples, 3.15%)arv..arvz`ratatui::layout::rect::Rect::top (3 samples, 0.15%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::bits (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (11 samples, 0.55%)arvz`ratatui::style::_::InternalBitFlags::insert (7 samples, 0.35%)arvz`ratatui::style::_::InternalBitFlags::union (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (106 samples, 5.30%)arvz`r..arvz`ratatui::buffer::cell::Cell::set_style (29 samples, 1.45%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (5 samples, 0.25%)arvz`ratatui::style::_::InternalBitFlags::remove (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::intersection (1 samples, 0.05%)arvz`core::cmp::max (1 samples, 0.05%)arvz`core::cmp::Ord::max (1 samples, 0.05%)arvz`core::cmp::max_by (1 samples, 0.05%)arvz`core::cmp::impls::_<impl core::cmp::Ord for u16>::cmp (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (3 samples, 0.15%)arvz`ratatui::buffer::buffer::Buffer::get_mut (4 samples, 0.20%)arvz`ratatui::layout::rect::Rect::top (1 samples, 0.05%)arvz`compact_str::CompactString::new (1 samples, 0.05%)arvz`ratatui::widgets::block::Block::render_bottom_side (7 samples, 0.35%)arvz`ratatui::buffer::cell::Cell::set_symbol (2 samples, 0.10%)arvz`core::ptr::drop_in_place<compact_str::CompactString> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<compact_str::repr::Repr> (1 samples, 0.05%)arvz`<compact_str::repr::Repr as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (2 samples, 0.10%)arvz`ratatui::buffer::buffer::Buffer::index_of (1 samples, 0.05%)arvz`ratatui::widgets::block::Block::render_borders (11 samples, 0.55%)arvz`ratatui::widgets::block::Block::render_top_side (4 samples, 0.20%)arvz`ratatui::buffer::cell::Cell::set_style (2 samples, 0.10%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::insert (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`<ratatui::text::line::Line as ratatui::widgets::WidgetRef>::render_ref (1 samples, 0.05%)arvz`<&W as ratatui::widgets::Widget>::render (1 samples, 0.05%)arvz`<ratatui::text::span::Span as ratatui::widgets::WidgetRef>::render_ref (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (1 samples, 0.05%)arvz`ratatui::buffer::cell::Cell::set_style (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::remove (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::difference (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::sum (1 samples, 0.05%)arvz`<usize as core::iter::traits::accum::Sum>::sum (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::fold (1 samples, 0.05%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width::_{{closure}} (1 samples, 0.05%)arvz`unicode_width::tables::charwidth::width (1 samples, 0.05%)arvz`<core::option::Option<W> as ratatui::widgets::WidgetRef>::render_ref (123 samples, 6.15%)arvz`<co..arvz`<ratatui::widgets::block::Block as ratatui::widgets::WidgetRef>::render_ref (123 samples, 6.15%)arvz`<ra..arvz`ratatui::widgets::block::Block::render_titles (4 samples, 0.20%)arvz`ratatui::widgets::block::Block::render_title_position (4 samples, 0.20%)arvz`ratatui::widgets::block::Block::render_center_titles (4 samples, 0.20%)arvz`ratatui::text::line::Line::width (2 samples, 0.10%)arvz`core::iter::traits::iterator::Iterator::sum (2 samples, 0.10%)arvz`<usize as core::iter::traits::accum::Sum>::sum (2 samples, 0.10%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.10%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.10%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (2 samples, 0.10%)arvz`core::ops::function::FnMut::call_mut (2 samples, 0.10%)arvz`ratatui::text::span::Span::width (2 samples, 0.10%)arvz`alloc::str::_<impl core::borrow::Borrow<str> for alloc::string::String>::borrow (1 samples, 0.05%)arvz`<T as core::convert::Into<U>>::into (1 samples, 0.05%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (14 samples, 0.70%)arvz`<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (12 samples, 0.60%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (14 samples, 0.70%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index_mut (5 samples, 0.25%)arvz`ratatui::buffer::buffer::Buffer::index_of (40 samples, 2.00%)a..arvz`ratatui::layout::rect::Rect::bottom (3 samples, 0.15%)arvz`ratatui::layout::rect::Rect::left (2 samples, 0.10%)arvz`ratatui::buffer::buffer::Buffer::get_mut (67 samples, 3.35%)arv..arvz`ratatui::layout::rect::Rect::right (2 samples, 0.10%)arvz`ratatui::buffer::buffer::Buffer::index_of (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (10 samples, 0.50%)arvz`ratatui::style::_::InternalBitFlags::insert (7 samples, 0.35%)arvz`ratatui::style::_::InternalBitFlags::union (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::bits (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::bits (6 samples, 0.30%)arvz`ratatui::style::_::InternalBitFlags::difference (11 samples, 0.55%)arvz`ratatui::buffer::buffer::Buffer::set_style (138 samples, 6.90%)arvz`rata..arvz`ratatui::buffer::cell::Cell::set_style (51 samples, 2.55%)ar..arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (32 samples, 1.60%)arvz`ratatui::style::_::InternalBitFlags::remove (26 samples, 1.30%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`<std::hash::random::DefaultHasher as core::hash::Hasher>::finish (2 samples, 0.10%)arvz`<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.10%)arvz`core::hash::BuildHasher::hash_one (3 samples, 0.15%)arvz`core::hash::impls::_<impl core::hash::Hash for &T>::hash (1 samples, 0.05%)arvz`<cassowary::Symbol as core::hash::Hash>::hash (1 samples, 0.05%)arvz`<cassowary::SymbolType as core::hash::Hash>::hash (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::find (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::find::_{{closure}} (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_constraint (5 samples, 0.25%)arvz`cassowary::solver_impl::Solver::optimise (5 samples, 0.25%)arvz`cassowary::solver_impl::Solver::substitute (5 samples, 0.25%)arvz`cassowary::Row::substitute (5 samples, 0.25%)arvz`cassowary::Row::insert_row (5 samples, 0.25%)arvz`cassowary::Row::insert_symbol (5 samples, 0.25%)arvz`std::collections::hash::map::HashMap<K,V,S>::entry (5 samples, 0.25%)arvz`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (5 samples, 0.25%)arvz`hashbrown::raw::RawTable<T,A>::reserve (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::reserve_rehash (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::reserve_rehash::_{{closure}} (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::create_row (1 samples, 0.05%)arvz`cassowary::Row::insert_row (1 samples, 0.05%)arvz`cassowary::Row::insert_symbol (1 samples, 0.05%)arvz`std::collections::hash::map::HashMap<K,V,S>::entry (1 samples, 0.05%)arvz`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (1 samples, 0.05%)arvz`<hashbrown::raw::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`ratatui::layout::layout::configure_constraints (2 samples, 0.10%)arvz`cassowary::solver_impl::Solver::add_constraint (2 samples, 0.10%)arvz`cassowary::solver_impl::Solver::optimise (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::substitute (1 samples, 0.05%)arvz`cassowary::Row::substitute (1 samples, 0.05%)arvz`cassowary::Row::insert_row (1 samples, 0.05%)arvz`cassowary::near_zero (1 samples, 0.05%)arvz`ratatui::layout::layout::configure_flex_constraints (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_constraint (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::optimise (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::substitute (1 samples, 0.05%)arvz`cassowary::Row::substitute (1 samples, 0.05%)arvz`std::collections::hash::map::HashMap<K,V,S>::remove (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::remove (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::remove_entry (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::remove_entry (1 samples, 0.05%)arvz`<hashbrown::raw::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::optimise (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::substitute (1 samples, 0.05%)arvz`cassowary::Row::substitute (1 samples, 0.05%)arvz`cassowary::Row::insert_row (1 samples, 0.05%)arvz`cassowary::Row::insert_symbol (1 samples, 0.05%)arvz`std::collections::hash::map::VacantEntry<K,V>::insert (1 samples, 0.05%)arvz`hashbrown::rustc_entry::RustcVacantEntry<K,V,A>::insert (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::insert_no_grow (1 samples, 0.05%)arvz`hashbrown::raw::RawTableInner::prepare_insert_slot (1 samples, 0.05%)arvz`hashbrown::raw::RawTableInner::find_insert_slot (1 samples, 0.05%)arvz`core::core_arch::aarch64::neon::vld1_u8 (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_with_artificial_variable (2 samples, 0.10%)arvz`cassowary::solver_impl::Solver::substitute (1 samples, 0.05%)arvz`cassowary::Row::substitute (1 samples, 0.05%)arvz`std::collections::hash::map::HashMap<K,V,S>::remove (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::remove (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::remove_entry (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::remove_entry (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::find (1 samples, 0.05%)arvz`ratatui::widgets::table::table::Table::get_columns_widths (11 samples, 0.55%)arvz`ratatui::layout::layout::Layout::split (11 samples, 0.55%)arvz`ratatui::layout::layout::Layout::split_with_spacers (11 samples, 0.55%)arvz`std::thread::local::LocalKey<T>::with (11 samples, 0.55%)arvz`std::thread::local::LocalKey<T>::try_with (11 samples, 0.55%)arvz`ratatui::layout::layout::Layout::split_with_spacers::_{{closure}} (11 samples, 0.55%)arvz`lru::LruCache<K,V,S>::get_or_insert (11 samples, 0.55%)arvz`ratatui::layout::layout::Layout::split_with_spacers::_{{closure}}::_{{closure}} (11 samples, 0.55%)arvz`ratatui::layout::layout::Layout::try_split (11 samples, 0.55%)arvz`ratatui::layout::layout::configure_variable_constraints (3 samples, 0.15%)arvz`cassowary::solver_impl::Solver::add_constraint (3 samples, 0.15%)arvz`cassowary::solver_impl::Solver::create_row (1 samples, 0.05%)arvz`alloc::alloc::exchange_malloc (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_constraint (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::substitute (1 samples, 0.05%)arvz`cassowary::Row::substitute (1 samples, 0.05%)arvz`std::collections::hash::map::HashMap<K,V,S>::remove (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::remove (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::remove_entry (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::remove_entry (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::find (1 samples, 0.05%)arvz`hashbrown::raw::neon::Group::match_byte (1 samples, 0.05%)arvz`ratatui::layout::layout::configure_flex_constraints (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_constraint (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::optimise (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::get_leaving_row (1 samples, 0.05%)arvz`cassowary::Row::coefficient_for (1 samples, 0.05%)arvz`std::collections::hash::map::HashMap<K,V,S>::get (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::get (1 samples, 0.05%)arvz`hashbrown::raw::RawTable<T,A>::get (1 samples, 0.05%)arvz`ratatui::widgets::table::table::Table::layout (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::split (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::split_with_spacers (3 samples, 0.15%)arvz`std::thread::local::LocalKey<T>::with (3 samples, 0.15%)arvz`std::thread::local::LocalKey<T>::try_with (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::split_with_spacers::_{{closure}} (3 samples, 0.15%)arvz`lru::LruCache<K,V,S>::get_or_insert (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::split_with_spacers::_{{closure}}::_{{closure}} (3 samples, 0.15%)arvz`ratatui::layout::layout::Layout::try_split (3 samples, 0.15%)arvz`ratatui::layout::layout::configure_variable_constraints (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_constraint (1 samples, 0.05%)arvz`cassowary::solver_impl::Solver::add_with_artificial_variable (1 samples, 0.05%)arvz`cassowary::Row::remove (1 samples, 0.05%)arvz`std::collections::hash::map::HashMap<K,V,S>::remove (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::remove (1 samples, 0.05%)arvz`hashbrown::map::HashMap<K,V,S,A>::remove_entry (1 samples, 0.05%)arvz`core::hash::BuildHasher::hash_one (1 samples, 0.05%)arvz`core::hash::impls::_<impl core::hash::Hash for &T>::hash (1 samples, 0.05%)arvz`<cassowary::Symbol as core::hash::Hash>::hash (1 samples, 0.05%)arvz`core::hash::impls::_<impl core::hash::Hash for usize>::hash (1 samples, 0.05%)arvz`core::hash::Hasher::write_usize (1 samples, 0.05%)arvz`<std::hash::random::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.05%)arvz`<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (2 samples, 0.10%)arvz`ratatui::buffer::cell::Cell::set_style (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`core::str::_<impl str>::chars (1 samples, 0.05%)arvz`core::str::traits::_<impl core::ops::index::Index<I> for str>::index (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (3 samples, 0.15%)arvz`<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::find (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::try_fold (3 samples, 0.15%)arvz`<unicode_segmentation::grapheme::Graphemes as core::iter::traits::iterator::Iterator>::next (3 samples, 0.15%)arvz`unicode_segmentation::grapheme::GraphemeCursor::next_boundary (2 samples, 0.10%)arvz`unicode_segmentation::grapheme::GraphemeCursor::is_boundary (1 samples, 0.05%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (2 samples, 0.10%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.10%)arvz`<&W as ratatui::widgets::Widget>::render (6 samples, 0.30%)arvz`<ratatui::text::span::Span as ratatui::widgets::WidgetRef>::render_ref (6 samples, 0.30%)arvz`<str as unicode_width::UnicodeWidthStr>::width (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::sum (3 samples, 0.15%)arvz`<usize as core::iter::traits::accum::Sum>::sum (3 samples, 0.15%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::fold (3 samples, 0.15%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (1 samples, 0.05%)arvz`core::option::Option<T>::unwrap_or (1 samples, 0.05%)arvz`ratatui::buffer::cell::Cell::set_style (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::insert (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (2 samples, 0.10%)arvz`ratatui::layout::rect::Rect::intersection (1 samples, 0.05%)arvz`core::cmp::max (1 samples, 0.05%)arvz`core::cmp::Ord::max (1 samples, 0.05%)arvz`core::cmp::max_by (1 samples, 0.05%)arvz`core::cmp::impls::_<impl core::cmp::Ord for u16>::cmp (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::right (1 samples, 0.05%)arvz`ratatui::text::line::Line::width (2 samples, 0.10%)arvz`core::iter::traits::iterator::Iterator::sum (2 samples, 0.10%)arvz`<usize as core::iter::traits::accum::Sum>::sum (2 samples, 0.10%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.10%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.10%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (1 samples, 0.05%)arvz`core::ops::function::FnMut::call_mut (1 samples, 0.05%)arvz`ratatui::text::span::Span::width (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::sum (1 samples, 0.05%)arvz`<usize as core::iter::traits::accum::Sum>::sum (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::fold (1 samples, 0.05%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::str::validations::next_code_point (1 samples, 0.05%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::str::validations::next_code_point (1 samples, 0.05%)arvz`<&W as ratatui::widgets::Widget>::render (13 samples, 0.65%)arvz`<ratatui::text::line::Line as ratatui::widgets::WidgetRef>::render_ref (13 samples, 0.65%)arvz`ratatui::text::span::Span::width (2 samples, 0.10%)arvz`<str as unicode_width::UnicodeWidthStr>::width (2 samples, 0.10%)arvz`core::iter::traits::iterator::Iterator::sum (2 samples, 0.10%)arvz`<usize as core::iter::traits::accum::Sum>::sum (2 samples, 0.10%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.10%)arvz`core::iter::traits::iterator::Iterator::fold (2 samples, 0.10%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (1 samples, 0.05%)arvz`<usize as core::iter::traits::accum::Sum>::sum::_{{closure}} (1 samples, 0.05%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (1 samples, 0.05%)arvz`<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (2 samples, 0.10%)arvz`ratatui::layout::rect::Rect::left (1 samples, 0.05%)arvz`<ratatui::text::text::Text as ratatui::widgets::Widget>::render (17 samples, 0.85%)arvz`<ratatui::text::text::Text as ratatui::widgets::WidgetRef>::render_ref (17 samples, 0.85%)arvz`ratatui::buffer::buffer::Buffer::set_style (4 samples, 0.20%)arvz`ratatui::layout::rect::Rect::intersection (1 samples, 0.05%)arvz`core::cmp::min (1 samples, 0.05%)arvz`core::cmp::Ord::min (1 samples, 0.05%)arvz`core::cmp::min_by (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (1 samples, 0.05%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index_mut (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (2 samples, 0.10%)arvz`ratatui::layout::rect::Rect::left (1 samples, 0.05%)arvz`ratatui::widgets::table::table::Table::render_header (22 samples, 1.10%)arvz`ratatui::widgets::table::cell::Cell::render (20 samples, 1.00%)arvz`ratatui::buffer::buffer::Buffer::set_style (3 samples, 0.15%)arvz`ratatui::buffer::cell::Cell::set_style (1 samples, 0.05%)arvz`<core::iter::adapters::zip::Zip<A,B> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::iter::adapters::zip::Zip<A,B> as core::iter::adapters::zip::ZipImpl<A,B>>::next (1 samples, 0.05%)arvz`<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (7 samples, 0.35%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (8 samples, 0.40%)arvz`<u16 as core::iter::range::Step>::forward_unchecked (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (4 samples, 0.20%)arvz`ratatui::buffer::buffer::Buffer::index_of (11 samples, 0.55%)arvz`ratatui::layout::rect::Rect::bottom (2 samples, 0.10%)arvz`ratatui::buffer::buffer::Buffer::get_mut (20 samples, 1.00%)arvz`ratatui::layout::rect::Rect::left (2 samples, 0.10%)arvz`ratatui::buffer::buffer::Buffer::index_of (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::insert (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (42 samples, 2.10%)a..arvz`ratatui::buffer::cell::Cell::set_style (10 samples, 0.50%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (5 samples, 0.25%)arvz`ratatui::style::_::InternalBitFlags::remove (4 samples, 0.20%)arvz`ratatui::style::_::InternalBitFlags::difference (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::new (2 samples, 0.10%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.10%)arvz`<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 0.15%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (3 samples, 0.15%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.10%)arvz`alloc::alloc::Global::alloc_impl (2 samples, 0.10%)arvz`<ratatui::text::span::Span as core::clone::Clone>::clone (4 samples, 0.20%)arvz`<alloc::borrow::Cow<B> as core::clone::Clone>::clone (4 samples, 0.20%)arvz`alloc::str::_<impl alloc::borrow::ToOwned for str>::to_owned (4 samples, 0.20%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.05%)arvz`alloc::alloc::Global::alloc_impl (1 samples, 0.05%)arvz`<T as alloc::slice::hack::ConvertVec>::to_vec (7 samples, 0.35%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (3 samples, 0.15%)arvz`core::alloc::layout::Layout::array::inner (1 samples, 0.05%)arvz`<ratatui::text::line::Line as core::clone::Clone>::clone (9 samples, 0.45%)arvz`<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (9 samples, 0.45%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`<ratatui::text::text::Text as core::clone::Clone>::clone (13 samples, 0.65%)arvz`<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (13 samples, 0.65%)arvz`<T as alloc::slice::hack::ConvertVec>::to_vec (13 samples, 0.65%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.05%)arvz`alloc::alloc::Global::alloc_impl (1 samples, 0.05%)arvz`<core::ops::control_flow::ControlFlow<B,C> as core::ops::try_trait::Try>::branch (1 samples, 0.05%)arvz`<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (4 samples, 0.20%)arvz`core::char::methods::_<impl char>::len_utf8 (1 samples, 0.05%)arvz`core::option::Option<T>::take (1 samples, 0.05%)arvz`core::str::_<impl str>::chars (2 samples, 0.10%)arvz`core::str::_<impl str>::is_char_boundary (6 samples, 0.30%)arvz`core::str::traits::_<impl core::ops::index::Index<I> for str>::index (17 samples, 0.85%)arvz`core::str::traits::_<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index (14 samples, 0.70%)arvz`core::str::traits::_<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::get (8 samples, 0.40%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (7 samples, 0.35%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (12 samples, 0.60%)arvz`core::str::validations::next_code_point (5 samples, 0.25%)arvz`core::option::Option<T>::unwrap (1 samples, 0.05%)arvz`core::str::_<impl str>::is_char_boundary (4 samples, 0.20%)arvz`core::str::traits::_<impl core::ops::index::Index<I> for str>::index (11 samples, 0.55%)arvz`core::str::traits::_<impl core::slice::index::SliceIndex<str> for core::ops::range::RangeFrom<usize>>::index (10 samples, 0.50%)arvz`core::str::traits::_<impl core::slice::index::SliceIndex<str> for core::ops::range::RangeFrom<usize>>::get (5 samples, 0.25%)arvz`unicode_segmentation::grapheme::GraphemeCursor::grapheme_category (3 samples, 0.15%)arvz`unicode_segmentation::grapheme::GraphemeCursor::is_boundary (5 samples, 0.25%)arvz`core::option::Option<T>::unwrap (1 samples, 0.05%)arvz`<unicode_segmentation::grapheme::Graphemes as core::iter::traits::iterator::Iterator>::next (73 samples, 3.65%)arvz..arvz`unicode_segmentation::grapheme::GraphemeCursor::next_boundary (44 samples, 2.20%)a..arvz`unicode_segmentation::grapheme::check_pair (3 samples, 0.15%)arvz`<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (88 samples, 4.40%)arvz`..arvz`core::iter::traits::iterator::Iterator::find (87 samples, 4.35%)arvz`..arvz`core::iter::traits::iterator::Iterator::try_fold (85 samples, 4.25%)arvz`..arvz`core::iter::traits::iterator::Iterator::find::check::_{{closure}} (7 samples, 0.35%)arvz`core::ops::function::impls::_<impl core::ops::function::FnMut<A> for &mut F>::call_mut (5 samples, 0.25%)arvz`ratatui::text::span::Span::styled_graphemes::_{{closure}} (4 samples, 0.20%)arvz`core::cmp::impls::_<impl core::cmp::PartialEq<&B> for &A>::ne (4 samples, 0.20%)arvz`core::cmp::PartialEq::ne (4 samples, 0.20%)arvz`core::str::traits::_<impl core::cmp::PartialEq for str>::eq (4 samples, 0.20%)arvz`<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.10%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (90 samples, 4.50%)arvz`..arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (9 samples, 0.45%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (22 samples, 1.10%)arvz`core::str::validations::next_code_point (11 samples, 0.55%)arvz`<str as unicode_width::UnicodeWidthStr>::width::_{{closure}} (3 samples, 0.15%)arvz`unicode_width::tables::charwidth::width (3 samples, 0.15%)arvz`<str as unicode_width::UnicodeWidthStr>::width (40 samples, 2.00%)a..arvz`core::iter::traits::iterator::Iterator::sum (38 samples, 1.90%)a..arvz`<usize as core::iter::traits::accum::Sum>::sum (37 samples, 1.85%)a..arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (36 samples, 1.80%)a..arvz`core::iter::traits::iterator::Iterator::fold (36 samples, 1.80%)a..arvz`core::iter::adapters::map::map_fold::_{{closure}} (7 samples, 0.35%)arvz`core::option::Option<T>::unwrap_or (2 samples, 0.10%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (2 samples, 0.10%)arvz`<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (2 samples, 0.10%)arvz`core::str::_<impl str>::chars (4 samples, 0.20%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::index_of (5 samples, 0.25%)arvz`ratatui::buffer::buffer::Buffer::get_mut (7 samples, 0.35%)arvz`ratatui::layout::rect::Rect::right (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (3 samples, 0.15%)arvz`ratatui::style::_::InternalBitFlags::insert (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::union (1 samples, 0.05%)arvz`ratatui::buffer::cell::Cell::set_style (10 samples, 0.50%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::remove (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`<&T as core::convert::AsRef<U>>::as_ref (1 samples, 0.05%)arvz`DYLD-STUB$$memcpy (1 samples, 0.05%)arvz`compact_str::repr::inline::InlineBuffer::new (3 samples, 0.15%)arvz`ratatui::buffer::cell::Cell::set_symbol (19 samples, 0.95%)arvz`compact_str::CompactString::new (17 samples, 0.85%)arvz`compact_str::repr::Repr::new (12 samples, 0.60%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`unicode_segmentation::grapheme::GraphemeCursor::new (1 samples, 0.05%)arvz`<str as unicode_segmentation::UnicodeSegmentation>::graphemes (2 samples, 0.10%)arvz`unicode_segmentation::grapheme::new_graphemes (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::filter (1 samples, 0.05%)arvz`core::option::Option<T>::or (1 samples, 0.05%)arvz`ratatui::style::Style::patch (2 samples, 0.10%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::insert (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::union (1 samples, 0.05%)arvz`<&W as ratatui::widgets::Widget>::render (186 samples, 9.30%)arvz`<&W as r..arvz`<ratatui::text::span::Span as ratatui::widgets::WidgetRef>::render_ref (186 samples, 9.30%)arvz`<ratatui..arvz`ratatui::text::span::Span::styled_graphemes (7 samples, 0.35%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`core::cmp::Ord::min (4 samples, 0.20%)arvz`core::cmp::min_by (4 samples, 0.20%)arvz`core::cmp::impls::_<impl core::cmp::Ord for u16>::cmp (1 samples, 0.05%)arvz`<T as core::convert::Into<U>>::into (1 samples, 0.05%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (4 samples, 0.20%)arvz`<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (2 samples, 0.10%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (7 samples, 0.35%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index_mut (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::index_of (12 samples, 0.60%)arvz`ratatui::layout::rect::Rect::bottom (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (25 samples, 1.25%)arvz`ratatui::layout::rect::Rect::right (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::index_of (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (8 samples, 0.40%)arvz`ratatui::style::_::InternalBitFlags::insert (5 samples, 0.25%)arvz`ratatui::style::_::InternalBitFlags::bits (4 samples, 0.20%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::difference (3 samples, 0.15%)arvz`ratatui::buffer::cell::Cell::set_style (23 samples, 1.15%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (9 samples, 0.45%)arvz`ratatui::style::_::InternalBitFlags::remove (7 samples, 0.35%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (2 samples, 0.10%)arvz`ratatui::layout::rect::Rect::bottom (1 samples, 0.05%)arvz`core::cmp::max (2 samples, 0.10%)arvz`core::cmp::Ord::max (2 samples, 0.10%)arvz`core::cmp::max_by (2 samples, 0.10%)arvz`core::cmp::impls::_<impl core::cmp::Ord for u16>::cmp (2 samples, 0.10%)arvz`ratatui::buffer::buffer::Buffer::set_style (62 samples, 3.10%)arv..arvz`ratatui::layout::rect::Rect::intersection (4 samples, 0.20%)arvz`core::cmp::min (2 samples, 0.10%)arvz`core::cmp::Ord::min (2 samples, 0.10%)arvz`core::cmp::min_by (2 samples, 0.10%)arvz`core::ops::function::FnOnce::call_once (2 samples, 0.10%)arvz`core::cmp::max (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::intersection (2 samples, 0.10%)arvz`core::cmp::min (1 samples, 0.05%)arvz`core::cmp::Ord::min (1 samples, 0.05%)arvz`core::cmp::min_by (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::right (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::top (1 samples, 0.05%)arvz`<alloc::borrow::Cow<B> as core::ops::deref::Deref>::deref (1 samples, 0.05%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (10 samples, 0.50%)arvz`core::str::validations::next_code_point (4 samples, 0.20%)arvz`<str as unicode_width::UnicodeWidthStr>::width::_{{closure}} (3 samples, 0.15%)arvz`unicode_width::tables::charwidth::width (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width (21 samples, 1.05%)arvz`core::iter::traits::iterator::Iterator::sum (21 samples, 1.05%)arvz`<usize as core::iter::traits::accum::Sum>::sum (21 samples, 1.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (21 samples, 1.05%)arvz`core::iter::traits::iterator::Iterator::fold (20 samples, 1.00%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (9 samples, 0.45%)arvz`core::option::Option<T>::unwrap_or (4 samples, 0.20%)arvz`ratatui::text::line::Line::width (24 samples, 1.20%)arvz`core::iter::traits::iterator::Iterator::sum (24 samples, 1.20%)arvz`<usize as core::iter::traits::accum::Sum>::sum (24 samples, 1.20%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (24 samples, 1.20%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold (24 samples, 1.20%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (24 samples, 1.20%)arvz`core::ops::function::FnMut::call_mut (24 samples, 1.20%)arvz`ratatui::text::span::Span::width (23 samples, 1.15%)arvz`core::str::_<impl str>::chars (1 samples, 0.05%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.10%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (4 samples, 0.20%)arvz`core::str::validations::next_code_point (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width (8 samples, 0.40%)arvz`core::iter::traits::iterator::Iterator::sum (8 samples, 0.40%)arvz`<usize as core::iter::traits::accum::Sum>::sum (8 samples, 0.40%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (8 samples, 0.40%)arvz`core::iter::traits::iterator::Iterator::fold (8 samples, 0.40%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (3 samples, 0.15%)arvz`<str as unicode_width::UnicodeWidthStr>::width::_{{closure}} (2 samples, 0.10%)arvz`unicode_width::tables::charwidth::width (2 samples, 0.10%)arvz`<ratatui::text::line::Line as ratatui::widgets::WidgetRef>::render_ref (289 samples, 14.45%)arvz`<ratatui::text::l..arvz`ratatui::text::span::Span::width (9 samples, 0.45%)arvz`alloc::str::_<impl core::borrow::Borrow<str> for alloc::string::String>::borrow (1 samples, 0.05%)arvz`core::slice::_<impl [T]>::iter (1 samples, 0.05%)arvz`<&W as ratatui::widgets::Widget>::render (291 samples, 14.55%)arvz`<&W as ratatui::w..arvz`ratatui::layout::rect::Rect::right (1 samples, 0.05%)arvz`<core::iter::adapters::zip::Zip<A,B> as core::iter::adapters::zip::ZipImpl<A,B>>::next (1 samples, 0.05%)arvz`<ratatui::layout::rect::iter::Rows as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::new (1 samples, 0.05%)arvz`<core::iter::adapters::zip::Zip<A,B> as core::iter::traits::iterator::Iterator>::next (3 samples, 0.15%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (2 samples, 0.10%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (3 samples, 0.15%)arvz`<u16 as core::iter::range::Step>::forward_unchecked (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (9 samples, 0.45%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index_mut (4 samples, 0.20%)arvz`ratatui::buffer::buffer::Buffer::index_of (12 samples, 0.60%)arvz`ratatui::layout::rect::Rect::bottom (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::right (2 samples, 0.10%)arvz`ratatui::buffer::buffer::Buffer::get_mut (28 samples, 1.40%)arvz`ratatui::layout::rect::Rect::top (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::bits (2 samples, 0.10%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (6 samples, 0.30%)arvz`ratatui::style::_::InternalBitFlags::insert (6 samples, 0.30%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::difference (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::set_style (54 samples, 2.70%)ar..arvz`ratatui::buffer::cell::Cell::set_style (21 samples, 1.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (8 samples, 0.40%)arvz`ratatui::style::_::InternalBitFlags::remove (6 samples, 0.30%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (2 samples, 0.10%)arvz`ratatui::layout::rect::Rect::right (1 samples, 0.05%)arvz`ratatui::layout::rect::Rect::top (1 samples, 0.05%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (9 samples, 0.45%)arvz`core::str::validations::next_code_point (4 samples, 0.20%)arvz`<str as unicode_width::UnicodeWidthStr>::width::_{{closure}} (4 samples, 0.20%)arvz`unicode_width::tables::charwidth::width (3 samples, 0.15%)arvz`<usize as core::iter::traits::accum::Sum>::sum::_{{closure}} (1 samples, 0.05%)arvz`<str as unicode_width::UnicodeWidthStr>::width (23 samples, 1.15%)arvz`core::iter::traits::iterator::Iterator::sum (23 samples, 1.15%)arvz`<usize as core::iter::traits::accum::Sum>::sum (23 samples, 1.15%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (23 samples, 1.15%)arvz`core::iter::traits::iterator::Iterator::fold (23 samples, 1.15%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (12 samples, 0.60%)arvz`core::option::Option<T>::unwrap_or (3 samples, 0.15%)arvz`<ratatui::text::text::Text as ratatui::widgets::WidgetRef>::render_ref (377 samples, 18.85%)arvz`<ratatui::text::text::Te..arvz`ratatui::text::line::Line::width (27 samples, 1.35%)arvz`core::iter::traits::iterator::Iterator::sum (27 samples, 1.35%)arvz`<usize as core::iter::traits::accum::Sum>::sum (27 samples, 1.35%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (27 samples, 1.35%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold (27 samples, 1.35%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (24 samples, 1.20%)arvz`core::ops::function::FnMut::call_mut (24 samples, 1.20%)arvz`ratatui::text::span::Span::width (24 samples, 1.20%)arvz`core::str::_<impl str>::chars (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.05%)libsystem_malloc.dylib`_nanov2_free (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (7 samples, 0.35%)arvz`core::ptr::drop_in_place<[ratatui::text::line::Line]> (5 samples, 0.25%)arvz`core::ptr::drop_in_place<ratatui::text::line::Line> (5 samples, 0.25%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::text::span::Span>> (5 samples, 0.25%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (5 samples, 0.25%)arvz`core::ptr::drop_in_place<[ratatui::text::span::Span]> (4 samples, 0.20%)arvz`core::ptr::drop_in_place<ratatui::text::span::Span> (4 samples, 0.20%)arvz`core::ptr::drop_in_place<alloc::borrow::Cow<str>> (4 samples, 0.20%)arvz`core::ptr::drop_in_place<alloc::string::String> (4 samples, 0.20%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<u8>> (3 samples, 0.15%)arvz`core::ptr::drop_in_place<alloc::raw_vec::RawVec<u8>> (3 samples, 0.15%)arvz`alloc::raw_vec::RawVec<T,A>::current_memory (2 samples, 0.10%)arvz`<ratatui::text::text::Text as ratatui::widgets::Widget>::render (385 samples, 19.25%)arvz`<ratatui::text::text::Tex..arvz`core::ptr::drop_in_place<ratatui::text::text::Text> (8 samples, 0.40%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::text::line::Line>> (8 samples, 0.40%)arvz`core::ptr::drop_in_place<alloc::raw_vec::RawVec<ratatui::text::line::Line>> (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.05%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (5 samples, 0.25%)arvz`<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (4 samples, 0.20%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::IndexMut<I>>::index_mut (5 samples, 0.25%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index_mut (3 samples, 0.15%)arvz`ratatui::buffer::buffer::Buffer::index_of (8 samples, 0.40%)arvz`ratatui::layout::rect::Rect::left (1 samples, 0.05%)arvz`ratatui::buffer::buffer::Buffer::get_mut (20 samples, 1.00%)arvz`ratatui::layout::rect::Rect::right (6 samples, 0.30%)arvz`ratatui::style::_::InternalBitFlags::bits (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::bits (2 samples, 0.10%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::insert (5 samples, 0.25%)arvz`ratatui::style::_::InternalBitFlags::insert (4 samples, 0.20%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (1 samples, 0.05%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::difference (5 samples, 0.25%)arvz`ratatui::buffer::cell::Cell::set_style (25 samples, 1.25%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::remove (13 samples, 0.65%)arvz`ratatui::style::_::InternalBitFlags::remove (11 samples, 0.55%)arvz`ratatui::style::_::InternalBitFlags::from_bits_retain (2 samples, 0.10%)arvz`<&ratatui::widgets::table::table::Table as ratatui::widgets::StatefulWidget>::render (796 samples, 39.80%)arvz`<&ratatui::widgets::table::table::Table as ratatui::widgets:..arvz`<ratatui::widgets::table::table::Table as ratatui::widgets::StatefulWidgetRef>::render_ref (796 samples, 39.80%)arvz`<ratatui::widgets::table::table::Table as ratatui::widgets::..arvz`ratatui::widgets::table::table::Table::render_rows (499 samples, 24.95%)arvz`ratatui::widgets::table::table::Tab..arvz`ratatui::widgets::table::cell::Cell::render (453 samples, 22.65%)arvz`ratatui::widgets::table::cell::..arvz`ratatui::buffer::buffer::Buffer::set_style (54 samples, 2.70%)ar..arvz`ratatui::layout::rect::Rect::intersection (2 samples, 0.10%)arvz`core::cmp::max (2 samples, 0.10%)arvz`core::cmp::Ord::max (2 samples, 0.10%)arvz`core::cmp::max_by (2 samples, 0.10%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (6 samples, 0.30%)arvz`core::ptr::drop_in_place<[ratatui::text::line::Line]> (5 samples, 0.25%)arvz`core::ptr::drop_in_place<ratatui::text::line::Line> (4 samples, 0.20%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::text::span::Span>> (3 samples, 0.15%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (3 samples, 0.15%)arvz`core::ptr::drop_in_place<[ratatui::text::span::Span]> (3 samples, 0.15%)arvz`core::ptr::drop_in_place<ratatui::text::span::Span> (2 samples, 0.10%)arvz`core::ptr::drop_in_place<alloc::borrow::Cow<str>> (2 samples, 0.10%)arvz`core::ptr::drop_in_place<alloc::string::String> (2 samples, 0.10%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<u8>> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<alloc::raw_vec::RawVec<u8>> (1 samples, 0.05%)arvz`<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.05%)libsystem_malloc.dylib`_nanov2_free (1 samples, 0.05%)arvz`ratatui::terminal::frame::Frame::render_stateful_widget (806 samples, 40.30%)arvz`ratatui::terminal::frame::Frame::render_stateful_widgetarvz`<ratatui::widgets::table::table::Table as ratatui::widgets::StatefulWidget>::render (806 samples, 40.30%)arvz`<ratatui::widgets::table::table::Table as ratatui::widgets::S..arvz`core::ptr::drop_in_place<ratatui::widgets::table::table::Table> (10 samples, 0.50%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::widgets::table::row::Row>> (10 samples, 0.50%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (10 samples, 0.50%)arvz`core::ptr::drop_in_place<[ratatui::widgets::table::row::Row]> (10 samples, 0.50%)arvz`core::ptr::drop_in_place<ratatui::widgets::table::row::Row> (9 samples, 0.45%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::widgets::table::cell::Cell>> (9 samples, 0.45%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (9 samples, 0.45%)arvz`core::ptr::drop_in_place<[ratatui::widgets::table::cell::Cell]> (9 samples, 0.45%)arvz`core::ptr::drop_in_place<ratatui::widgets::table::cell::Cell> (9 samples, 0.45%)arvz`core::ptr::drop_in_place<ratatui::text::text::Text> (9 samples, 0.45%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::text::line::Line>> (9 samples, 0.45%)arvz`core::ptr::drop_in_place<alloc::raw_vec::RawVec<ratatui::text::line::Line>> (3 samples, 0.15%)arvz`<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (3 samples, 0.15%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::deallocate (3 samples, 0.15%)libsystem_malloc.dylib`nanov2_madvise_block (2 samples, 0.10%)libsystem_malloc.dylib`nanov2_madvise_block_locked (2 samples, 0.10%)libsystem_kernel.dylib`madvise (2 samples, 0.10%)arvz`<ratatui::text::text::Text as core::default::Default>::default (1 samples, 0.05%)arvz`<ratatui::style::Style as core::default::Default>::default (1 samples, 0.05%)arvz`ratatui::style::Style::new (1 samples, 0.05%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::empty (1 samples, 0.05%)arvz`<ratatui::text::text::Text as core::convert::From<alloc::vec::Vec<ratatui::text::line::Line>>>::from (2 samples, 0.10%)arvz`core::ptr::drop_in_place<ratatui::text::text::Text> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<alloc::vec::Vec<ratatui::text::line::Line>> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<alloc::raw_vec::RawVec<ratatui::text::line::Line>> (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.05%)arvz`alloc::vec::Vec<T,A>::extend_desugared (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::str::iter::Lines as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::str::iter::Lines as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`<core::str::LinesMap as core::ops::function::FnMut<(&str,)>>::call_mut (1 samples, 0.05%)arvz`<core::str::LinesMap as core::ops::function::Fn<(&str,)>>::call (1 samples, 0.05%)arvz`<&str as core::str::pattern::Pattern>::strip_suffix_of (1 samples, 0.05%)arvz`core::slice::_<impl [T]>::ends_with (1 samples, 0.05%)libsystem_platform.dylib`_platform_memcmp (1 samples, 0.05%)arvz`<ratatui::text::line::Line as core::convert::From<alloc::vec::Vec<ratatui::text::span::Span>>>::from (2 samples, 0.10%)arvz`<ratatui::text::line::Line as core::default::Default>::default (2 samples, 0.10%)arvz`<ratatui::style::Style as core::default::Default>::default (2 samples, 0.10%)arvz`ratatui::style::Style::new (1 samples, 0.05%)arvz`alloc::alloc::exchange_malloc (1 samples, 0.05%)libsystem_malloc.dylib`nanov2_malloc (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.25%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (4 samples, 0.20%)arvz`core::ops::function::FnMut::call_mut (4 samples, 0.20%)arvz`<ratatui::text::line::Line as core::convert::From<&str>>::from (4 samples, 0.20%)arvz`alloc::slice::hack::into_vec (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (7 samples, 0.35%)arvz`alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.05%)arvz`alloc::alloc::Global::alloc_impl (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::collect (8 samples, 0.40%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (8 samples, 0.40%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (8 samples, 0.40%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`core::ops::function::FnMut::call_mut (12 samples, 0.60%)arvz`<T as core::convert::Into<U>>::into (12 samples, 0.60%)arvz`<ratatui::widgets::table::cell::Cell as core::convert::From<T>>::from (12 samples, 0.60%)arvz`<T as core::convert::Into<U>>::into (12 samples, 0.60%)arvz`<ratatui::text::text::Text as core::convert::From<&str>>::from (12 samples, 0.60%)arvz`ratatui::text::text::Text::raw (12 samples, 0.60%)arvz`core::str::_<impl str>::lines (1 samples, 0.05%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`ratatui::widgets::table::row::Row::new (14 samples, 0.70%)arvz`core::iter::traits::iterator::Iterator::collect (14 samples, 0.70%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (14 samples, 0.70%)arvz`alloc::vec::in_place_collect::_<impl alloc::vec::spec_from_iter::SpecFromIter<T,I> for alloc::vec::Vec<T>>::from_iter (14 samples, 0.70%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (14 samples, 0.70%)arvz`<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (14 samples, 0.70%)arvz`alloc::vec::Vec<T,A>::extend_trusted (14 samples, 0.70%)arvz`core::iter::traits::iterator::Iterator::for_each (14 samples, 0.70%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (14 samples, 0.70%)arvz`core::iter::traits::iterator::Iterator::fold (14 samples, 0.70%)arvz`core::iter::adapters::map::map_fold::_{{closure}} (14 samples, 0.70%)libsystem_platform.dylib`_platform_memmove (2 samples, 0.10%)arvz`itertools::Itertools::collect_vec (1 samples, 0.05%)arvz`core::iter::traits::iterator::Iterator::collect (1 samples, 0.05%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1 samples, 0.05%)arvz`alloc::vec::in_place_collect::_<impl alloc::vec::spec_from_iter::SpecFromIter<T,I> for alloc::vec::Vec<T>>::from_iter (1 samples, 0.05%)arvz`<alloc::vec::into_iter::IntoIter<T,A> as core::iter::adapters::SourceIter>::as_inner (1 samples, 0.05%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::for_each (1 samples, 0.05%)arvz`<arvz::components::table::main::MainTable as arvz::components::Component>::draw (909 samples, 45.45%)arvz`<arvz::components::table::main::MainTable as arvz::components::Compone..arvz`ratatui::widgets::table::table::Table::new (3 samples, 0.15%)arvz`ratatui::widgets::table::table::ensure_percentages_less_than_100 (2 samples, 0.10%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`arvz::app::App::run::_{{closure}}::_{{closure}} (947 samples, 47.35%)arvz`arvz::app::App::run::_{{closure}}::_{{closure}}arvz`arvz::components::LinkedComponent::draw_components (947 samples, 47.35%)arvz`arvz::components::LinkedComponent::draw_componentsarvz`core::cell::RefCell<T>::try_borrow_mut (1 samples, 0.05%)arvz`std::fs::OpenOptions::_open (15 samples, 0.75%)arvz`std::sys::unix::fs::File::open_c (15 samples, 0.75%)libsystem_kernel.dylib`__open (15 samples, 0.75%)arvz`std::fs::OpenOptions::open (16 samples, 0.80%)arvz`std::sys::unix::fs::File::open_c (1 samples, 0.05%)arvz`ratatui::terminal::terminal::Terminal<B>::autoresize (17 samples, 0.85%)arvz`ratatui::terminal::terminal::Terminal<B>::size (17 samples, 0.85%)arvz`<ratatui::backend::crossterm::CrosstermBackend<W> as ratatui::backend::Backend>::size (17 samples, 0.85%)arvz`crossterm::terminal::size (17 samples, 0.85%)arvz`crossterm::terminal::sys::unix::size (17 samples, 0.85%)arvz`crossterm::terminal::sys::unix::window_size (17 samples, 0.85%)arvz`std::fs::File::open (17 samples, 0.85%)arvz`std::path::_<impl core::convert::AsRef<std::path::Path> for str>::as_ref (1 samples, 0.05%)arvz`<ratatui::backend::crossterm::CrosstermBackend<W> as ratatui::backend::Backend>::draw (1 samples, 0.05%)arvz`<core::iter::adapters::zip::Zip<A,B> as core::iter::adapters::zip::ZipImpl<A,B>>::next (25 samples, 1.25%)arvz`<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::next (53 samples, 2.65%)ar..arvz`<core::iter::adapters::zip::Zip<A,B> as core::iter::traits::iterator::Iterator>::next (31 samples, 1.55%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::__iterator_get_unchecked (3 samples, 0.15%)arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (3 samples, 0.15%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (97 samples, 4.85%)arvz`<..arvz`<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (210 samples, 10.50%)arvz`<core::str..arvz`core::str::validations::next_code_point (83 samples, 4.15%)arvz`..arvz`<usize as core::iter::traits::accum::Sum>::sum::_{{closure}} (2 samples, 0.10%)arvz`<str as unicode_width::UnicodeWidthStr>::width::_{{closure}} (34 samples, 1.70%)arvz`unicode_width::tables::charwidth::width (23 samples, 1.15%)arvz`unicode_width::tables::charwidth::lookup_width (4 samples, 0.20%)arvz`<usize as core::iter::traits::accum::Sum>::sum::_{{closure}} (5 samples, 0.25%)arvz`<str as unicode_width::UnicodeWidthStr>::width (375 samples, 18.75%)arvz`<str as unicode_width::U..arvz`core::iter::traits::iterator::Iterator::sum (369 samples, 18.45%)arvz`core::iter::traits::iter..arvz`<usize as core::iter::traits::accum::Sum>::sum (366 samples, 18.30%)arvz`<usize as core::iter::tr..arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (356 samples, 17.80%)arvz`<core::iter::adapters::..arvz`core::iter::traits::iterator::Iterator::fold (341 samples, 17.05%)arvz`core::iter::traits::i..arvz`core::iter::adapters::map::map_fold::_{{closure}} (83 samples, 4.15%)arvz`..arvz`core::option::Option<T>::unwrap_or (19 samples, 0.95%)arvz`core::cmp::impls::_<impl core::cmp::Ord for usize>::cmp (10 samples, 0.50%)arvz`compact_str::repr::Repr::as_slice (25 samples, 1.25%)arvz`core::cmp::min (19 samples, 0.95%)arvz`core::cmp::Ord::min (19 samples, 0.95%)arvz`core::cmp::min_by (19 samples, 0.95%)arvz`core::ops::function::FnOnce::call_once (2 samples, 0.10%)arvz`<compact_str::CompactString as core::convert::AsRef<str>>::as_ref (35 samples, 1.75%)arvz`compact_str::CompactString::as_str (34 samples, 1.70%)arvz`compact_str::repr::Repr::as_str (30 samples, 1.50%)arvz`core::slice::raw::from_raw_parts (2 samples, 0.10%)arvz`core::cmp::impls::_<impl core::cmp::Ord for usize>::cmp (8 samples, 0.40%)arvz`compact_str::repr::Repr::as_slice (31 samples, 1.55%)arvz`core::cmp::min (26 samples, 1.30%)arvz`core::cmp::Ord::min (24 samples, 1.20%)arvz`core::cmp::min_by (21 samples, 1.05%)arvz`core::ops::function::FnOnce::call_once (4 samples, 0.20%)arvz`compact_str::repr::Repr::as_str (39 samples, 1.95%)a..arvz`core::slice::raw::from_raw_parts (6 samples, 0.30%)arvz`compact_str::CompactString::as_str (43 samples, 2.15%)a..arvz`core::str::converts::from_utf8_unchecked (3 samples, 0.15%)arvz`<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (20 samples, 1.00%)arvz`DYLD-STUB$$memcmp (3 samples, 0.15%)arvz`<compact_str::CompactString as core::cmp::PartialEq<T>>::eq (124 samples, 6.20%)arvz`<co..arvz`core::cmp::impls::_<impl core::cmp::PartialEq<&B> for &A>::eq (46 samples, 2.30%)a..arvz`core::str::traits::_<impl core::cmp::PartialEq for str>::eq (42 samples, 2.10%)a..libsystem_platform.dylib`_platform_memcmp (7 samples, 0.35%)arvz`<ratatui::style::Modifier as core::cmp::PartialEq>::eq (2 samples, 0.10%)arvz`<ratatui::buffer::cell::Cell as core::cmp::PartialEq>::eq (144 samples, 7.20%)arvz`<rata..arvz`<ratatui::style::_::InternalBitFlags as core::cmp::PartialEq>::eq (3 samples, 0.15%)arvz`core::cmp::impls::_<impl core::cmp::PartialEq<&B> for &A>::ne (166 samples, 8.30%)arvz`core::c..arvz`core::cmp::PartialEq::ne (163 samples, 8.15%)arvz`core::..arvz`<ratatui::style::color::Color as core::cmp::PartialEq>::eq (17 samples, 0.85%)arvz`core::cmp::impls::_<impl core::cmp::Ord for usize>::cmp (22 samples, 1.10%)arvz`core::cmp::max (74 samples, 3.70%)arvz..arvz`core::cmp::Ord::max (66 samples, 3.30%)arv..arvz`core::cmp::max_by (62 samples, 3.10%)arv..arvz`core::ops::function::FnOnce::call_once (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::map (9 samples, 0.45%)arvz`core::str::_<impl str>::chars (37 samples, 1.85%)a..arvz`core::cmp::impls::_<impl core::cmp::Ord for usize>::cmp (8 samples, 0.40%)arvz`compact_str::repr::Repr::as_slice (96 samples, 4.80%)arvz`c..arvz`core::cmp::min (68 samples, 3.40%)arv..arvz`core::cmp::Ord::min (61 samples, 3.05%)arv..arvz`core::cmp::min_by (55 samples, 2.75%)ar..arvz`core::ops::function::FnOnce::call_once (7 samples, 0.35%)arvz`compact_str::repr::Repr::as_str (110 samples, 5.50%)arvz`co..arvz`core::slice::raw::from_raw_parts (10 samples, 0.50%)arvz`ratatui::terminal::terminal::Terminal<B>::flush (866 samples, 43.30%)arvz`ratatui::terminal::terminal::Terminal<B>::flusharvz`ratatui::buffer::buffer::Buffer::diff (865 samples, 43.25%)arvz`ratatui::buffer::buffer::Buffer::diffarvz`ratatui::buffer::cell::Cell::symbol (126 samples, 6.30%)arvz`rat..arvz`compact_str::CompactString::as_str (120 samples, 6.00%)arvz`com..arvz`core::str::converts::from_utf8_unchecked (2 samples, 0.10%)arvz`<core::slice::iter::IterMut<T> as core::iter::traits::iterator::Iterator>::next (13 samples, 0.65%)arvz`DYLD-STUB$$memcpy (2 samples, 0.10%)arvz`compact_str::repr::inline::InlineBuffer::new (3 samples, 0.15%)arvz`compact_str::repr::Repr::new (13 samples, 0.65%)libsystem_platform.dylib`_platform_memmove (2 samples, 0.10%)arvz`compact_str::repr::inline::InlineBuffer::new (1 samples, 0.05%)arvz`compact_str::CompactString::new (17 samples, 0.85%)arvz`core::str::_<impl str>::len (1 samples, 0.05%)arvz`compact_str::repr::Repr::new (1 samples, 0.05%)arvz`core::ptr::drop_in_place<compact_str::CompactString> (6 samples, 0.30%)arvz`core::ptr::drop_in_place<compact_str::repr::Repr> (5 samples, 0.25%)arvz`<compact_str::repr::Repr as core::ops::drop::Drop>::drop (2 samples, 0.10%)arvz`ratatui::style::_::InternalBitFlags::empty (1 samples, 0.05%)arvz`ratatui::terminal::terminal::Terminal<B>::draw (1,877 samples, 93.85%)arvz`ratatui::terminal::terminal::Terminal<B>::drawarvz`ratatui::terminal::terminal::Terminal<B>::swap_buffers (47 samples, 2.35%)a..arvz`ratatui::buffer::buffer::Buffer::reset (34 samples, 1.70%)arvz`ratatui::buffer::cell::Cell::reset (31 samples, 1.55%)arvz`ratatui::style::_::_<impl ratatui::style::Modifier>::empty (3 samples, 0.15%)arvz`tokio::sync::mpsc::unbounded::UnboundedSender<T>::send (1 samples, 0.05%)arvz`tokio::sync::mpsc::chan::Tx<T,S>::send (1 samples, 0.05%)arvz`tokio::sync::mpsc::chan::Chan<T,S>::send (1 samples, 0.05%)arvz`tokio::sync::mpsc::list::Tx<T>::push (1 samples, 0.05%)arvz`tokio::sync::mpsc::block::Block<T>::write (1 samples, 0.05%)arvz`arvz::app::App::run::_{{closure}} (1,891 samples, 94.55%)arvz`arvz::app::App::run::_{{closure}}arvz`tokio::sync::mutex::Mutex<T>::lock::_{{closure}} (2 samples, 0.10%)arvz`tokio::sync::mutex::Mutex<T>::lock::_{{closure}}::_{{closure}} (2 samples, 0.10%)arvz`tokio::sync::mutex::Mutex<T>::acquire::_{{closure}} (1 samples, 0.05%)arvz`arvz::tui::Tui::next (1 samples, 0.05%)arvz`regex_automata::meta::regex::Builder::build_many_from_hir (1 samples, 0.05%)arvz`regex_automata::meta::strategy::new (1 samples, 0.05%)arvz`regex_automata::meta::strategy::Core::new (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::compile (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::compile::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_concat (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_slice (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_slice::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_concat (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_repetition (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_bounded (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_slice (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.05%)arvz`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnOnce<A> for &mut F>::call_once (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_alt_slice::_{{closure}} (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_repetition (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_at_least (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.05%)arvz`regex_automata::nfa::thompson::compiler::Compiler::c_unicode_class (1 samples, 0.05%)arvz`<regex_syntax::utf8::Utf8Sequences as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`regex_syntax::utf8::ScalarRange::encode (1 samples, 0.05%)arvz`core::char::methods::_<impl char>::encode_utf8 (1 samples, 0.05%)arvz`core::char::methods::encode_utf8_raw (1 samples, 0.05%)arvz`<core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index_mut (1 samples, 0.05%)arvz`once_cell::imp::OnceCell<T>::initialize (2 samples, 0.10%)arvz`once_cell::imp::initialize_or_wait (2 samples, 0.10%)arvz`core::ops::function::impls::_<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 0.10%)arvz`once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.10%)arvz`once_cell::sync::OnceCell<T>::get_or_init::_{{closure}} (2 samples, 0.10%)arvz`once_cell::sync::Lazy<T,F>::force::_{{closure}} (2 samples, 0.10%)arvz`core::ops::function::FnOnce::call_once (2 samples, 0.10%)arvz`core::ops::function::FnOnce::call_once (2 samples, 0.10%)arvz`tracing_subscriber::filter::env::directive::Directive::parse::DIRECTIVE_RE::_{{closure}} (2 samples, 0.10%)arvz`regex::regex::string::Regex::new (2 samples, 0.10%)arvz`regex::builders::string::RegexBuilder::build (2 samples, 0.10%)arvz`regex::builders::Builder::build_one_string (2 samples, 0.10%)arvz`regex_automata::meta::regex::Builder::build (2 samples, 0.10%)arvz`regex_automata::meta::regex::Builder::build_many (2 samples, 0.10%)arvz`regex_syntax::hir::translate::Translator::translate (1 samples, 0.05%)arvz`regex_syntax::ast::visitor::visit (1 samples, 0.05%)arvz`regex_syntax::ast::visitor::HeapVisitor::visit (1 samples, 0.05%)arvz`regex_syntax::ast::visitor::HeapVisitor::induct (1 samples, 0.05%)arvz`regex_syntax::ast::visitor::HeapVisitor::visit_class (1 samples, 0.05%)arvz`regex_syntax::ast::visitor::HeapVisitor::visit_class_post (1 samples, 0.05%)arvz`<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_post (1 samples, 0.05%)arvz`regex_syntax::hir::ClassUnicode::push (1 samples, 0.05%)arvz`regex_syntax::hir::interval::IntervalSet<I>::push (1 samples, 0.05%)arvz`regex_syntax::hir::interval::IntervalSet<I>::canonicalize (1 samples, 0.05%)arvz`regex_syntax::hir::interval::Interval::union (1 samples, 0.05%)arvz`regex_syntax::hir::interval::Interval::is_contiguous (1 samples, 0.05%)arvz`core::cmp::min (1 samples, 0.05%)arvz`core::cmp::Ord::min (1 samples, 0.05%)arvz`core::cmp::min_by (1 samples, 0.05%)arvz`core::ops::function::FnOnce::call_once (1 samples, 0.05%)arvz`tracing_subscriber::filter::env::EnvFilter::from_default_env (3 samples, 0.15%)arvz`tracing_subscriber::filter::env::builder::Builder::from_env_lossy (3 samples, 0.15%)arvz`tracing_subscriber::filter::env::builder::Builder::parse_lossy (3 samples, 0.15%)arvz`tracing_subscriber::filter::env::builder::Builder::from_directives (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::collect (3 samples, 0.15%)arvz`<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (3 samples, 0.15%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (3 samples, 0.15%)arvz`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (3 samples, 0.15%)arvz`<core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::find_map (3 samples, 0.15%)arvz`<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::try_fold (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::try_fold (3 samples, 0.15%)arvz`core::iter::adapters::filter::filter_try_fold::_{{closure}} (3 samples, 0.15%)arvz`core::iter::traits::iterator::Iterator::find_map::check::_{{closure}} (3 samples, 0.15%)arvz`core::ops::function::impls::_<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3 samples, 0.15%)arvz`tracing_subscriber::filter::env::builder::Builder::parse_lossy::_{{closure}} (3 samples, 0.15%)arvz`tracing_subscriber::filter::env::directive::Directive::parse (3 samples, 0.15%)arvz`<once_cell::sync::Lazy<T,F> as core::ops::deref::Deref>::deref (3 samples, 0.15%)arvz`once_cell::sync::Lazy<T,F>::force (3 samples, 0.15%)arvz`once_cell::sync::OnceCell<T>::get_or_init (3 samples, 0.15%)arvz`once_cell::sync::OnceCell<T>::get_or_try_init (3 samples, 0.15%)arvz`once_cell::sync::OnceCell<T>::get (1 samples, 0.05%)arvz`core::sync::atomic::AtomicPtr<T>::load (1 samples, 0.05%)arvz`arvz::utils::initialize_logging (4 samples, 0.20%)arvz`tracing_subscriber::registry (1 samples, 0.05%)arvz`<tracing_subscriber::registry::sharded::Registry as core::default::Default>::default (1 samples, 0.05%)arvz`sharded_slab::pool::Pool<T>::new (1 samples, 0.05%)arvz`sharded_slab::pool::Pool<T>::new_with_config (1 samples, 0.05%)arvz`sharded_slab::shard::Array<T,C>::new (1 samples, 0.05%)arvz`tokio::runtime::park::CachedParkThread::block_on::_{{closure}} (1,899 samples, 94.95%)arvz`tokio::runtime::park::CachedParkThread::block_on::_{{closure}}arvz`arvz::main::_{{closure}} (1,899 samples, 94.95%)arvz`arvz::main::_{{closure}}arvz`arvz::tokio_main::_{{closure}} (1,899 samples, 94.95%)arvz`arvz::tokio_main::_{{closure}}arvz`clap_builder::derive::Parser::parse (1 samples, 0.05%)arvz`clap_builder::builder::command::Command::get_matches (1 samples, 0.05%)arvz`clap_builder::builder::command::Command::get_matches_from (1 samples, 0.05%)arvz`clap_builder::builder::command::Command::try_get_matches_from_mut (1 samples, 0.05%)arvz`clap_builder::builder::command::Command::_do_parse (1 samples, 0.05%)arvz`clap_builder::builder::command::Command::_build_self (1 samples, 0.05%)arvz`clap_builder::builder::debug_asserts::assert_app (1 samples, 0.05%)arvz`clap_builder::builder::command::Command::two_args_of (1 samples, 0.05%)arvz`clap_builder::builder::command::two_elements_of (1 samples, 0.05%)arvz`<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.05%)arvz`<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (1 samples, 0.05%)arvz`core::ops::function::impls::_<impl core::ops::function::FnMut<A> for &mut F>::call_mut (1 samples, 0.05%)arvz`clap_builder::builder::command::Command::two_args_of::_{{closure}} (1 samples, 0.05%)arvz`clap_builder::builder::debug_asserts::assert_app::_{{closure}} (1 samples, 0.05%)arvz`core::cmp::impls::_<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.05%)arvz`<clap_builder::util::id::Id as core::cmp::PartialEq>::eq (1 samples, 0.05%)arvz`<clap_builder::builder::str::Str as core::cmp::PartialEq>::eq (1 samples, 0.05%)arvz`clap_builder::builder::str::_<impl core::cmp::PartialEq for clap_builder::builder::str::inner::Inner>::eq (1 samples, 0.05%)arvz`main (1,904 samples, 95.20%)arvz`mainarvz`std::rt::lang_start (1,904 samples, 95.20%)arvz`std::rt::lang_startarvz`std::rt::lang_start_internal (1,904 samples, 95.20%)arvz`std::rt::lang_start_internalarvz`std::rt::lang_start::_{{closure}} (1,904 samples, 95.20%)arvz`std::rt::lang_start::_{{closure}}arvz`std::sys_common::backtrace::__rust_begin_short_backtrace (1,904 samples, 95.20%)arvz`std::sys_common::backtrace::__rust_begin_short_backtracearvz`core::ops::function::FnOnce::call_once (1,904 samples, 95.20%)arvz`core::ops::function::FnOnce::call_oncearvz`arvz::main (1,904 samples, 95.20%)arvz`arvz::mainarvz`tokio::runtime::runtime::Runtime::block_on (1,903 samples, 95.15%)arvz`tokio::runtime::runtime::Runtime::block_onarvz`tokio::runtime::scheduler::multi_thread::MultiThread::block_on (1,903 samples, 95.15%)arvz`tokio::runtime::scheduler::multi_thread::MultiThread::block_onarvz`tokio::runtime::context::runtime::enter_runtime (1,903 samples, 95.15%)arvz`tokio::runtime::context::runtime::enter_runtimearvz`tokio::runtime::scheduler::multi_thread::MultiThread::block_on::_{{closure}} (1,903 samples, 95.15%)arvz`tokio::runtime::scheduler::multi_thread::MultiThread::block_on::_{{closure}}arvz`tokio::runtime::context::blocking::BlockingRegionGuard::block_on (1,903 samples, 95.15%)arvz`tokio::runtime::context::blocking::BlockingRegionGuard::block_onarvz`tokio::runtime::park::CachedParkThread::block_on (1,903 samples, 95.15%)arvz`tokio::runtime::park::CachedParkThread::block_onarvz`tokio::runtime::park::CachedParkThread::park (3 samples, 0.15%)arvz`tokio::runtime::park::CachedParkThread::with_current (3 samples, 0.15%)arvz`std::thread::local::LocalKey<T>::try_with (3 samples, 0.15%)arvz`tokio::runtime::park::CachedParkThread::with_current::_{{closure}} (3 samples, 0.15%)arvz`tokio::runtime::park::CachedParkThread::park::_{{closure}} (3 samples, 0.15%)arvz`tokio::runtime::park::Inner::park (3 samples, 0.15%)arvz`tokio::loom::std::parking_lot::Condvar::wait (3 samples, 0.15%)arvz`parking_lot::condvar::Condvar::wait (3 samples, 0.15%)arvz`parking_lot::condvar::Condvar::wait_until_internal (3 samples, 0.15%)arvz`parking_lot_core::parking_lot::park (3 samples, 0.15%)arvz`parking_lot_core::parking_lot::park::_{{closure}} (3 samples, 0.15%)arvz`<parking_lot_core::thread_parker::imp::ThreadParker as parking_lot_core::thread_parker::ThreadParkerT>::park (3 samples, 0.15%)libsystem_kernel.dylib`__psynch_cvwait (2 samples, 0.10%)dyld`start (1,905 samples, 95.25%)dyld`startdyld`lsl::EphemeralAllocator::~EphemeralAllocator (1 samples, 0.05%)dyld`lsl::EphemeralAllocator::reset (1 samples, 0.05%)dyld`_kernelrpc_mach_vm_deallocate_trap (1 samples, 0.05%)libsystem_kernel.dylib`__exit (1 samples, 0.05%)libsystem_pthread.dylib`start_wqthread (1 samples, 0.05%)libsystem_pthread.dylib`_pthread_wqthread (1 samples, 0.05%)libdispatch.dylib`_dispatch_workloop_worker_thread (1 samples, 0.05%)libdispatch.dylib`_dispatch_root_queue_drain_deferred_wlh (1 samples, 0.05%)libdispatch.dylib`_dispatch_lane_invoke (1 samples, 0.05%)libdispatch.dylib`_dispatch_lane_serial_drain (1 samples, 0.05%)libdispatch.dylib`_dispatch_client_callout (1 samples, 0.05%)libdispatch.dylib`_dispatch_block_async_invoke2 (1 samples, 0.05%)CoreAnalytics`invocation function for block in CoreAnalytics::Client::sendXpcMessage_sync (1 samples, 0.05%)libdispatch.dylib`_dispatch_lane_barrier_sync_invoke_and_complete (1 samples, 0.05%)libdispatch.dylib`_dispatch_client_callout (1 samples, 0.05%)CoreAnalytics`invocation function for block in CoreAnalytics::Client::acquireSendTransaction (1 samples, 0.05%)libxpc.dylib`os_transaction_create (1 samples, 0.05%)libxpc.dylib`_xpc_os_transaction_alloc (1 samples, 0.05%)libobjc.A.dylib`_objc_msgSend_uncached (1 samples, 0.05%)libobjc.A.dylib`lookUpImpOrForward (1 samples, 0.05%)libobjc.A.dylib`initializeAndMaybeRelock(objc_class*, objc_object*, locker_mixin<lockdebug::lock_mixin (1 samples, 0.05%)libobjc.A.dylib`initializeNonMetaClass (1 samples, 0.05%)libobjc.A.dylib`CALLING_SOME_+initialize_METHOD (1 samples, 0.05%)libobjc.A.dylib`_objc_msgSend_uncached (1 samples, 0.05%)libobjc.A.dylib`lookUpImpOrForward (1 samples, 0.05%)libobjc.A.dylib`getMethodNoSuper_nolock(objc_class*, objc_selector*) (1 samples, 0.05%)arvz`<crossterm::event::stream::EventStream as core::default::Default>::default::_{{closure}} (1 samples, 0.05%)arvz`std::sync::mpsc::Receiver<T>::recv (1 samples, 0.05%)arvz`std::sync::mpmc::Receiver<T>::recv (1 samples, 0.05%)arvz`std::sync::mpmc::array::Channel<T>::recv (1 samples, 0.05%)arvz`std::sync::mpmc::context::Context::with (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::try_with (1 samples, 0.05%)arvz`std::sync::mpmc::context::Context::with::_{{closure}} (1 samples, 0.05%)arvz`std::sync::mpmc::array::Channel<T>::recv::_{{closure}} (1 samples, 0.05%)arvz`std::sync::mpmc::context::Context::wait_until (1 samples, 0.05%)arvz`std::thread::park (1 samples, 0.05%)libdispatch.dylib`_dispatch_semaphore_wait_slow (1 samples, 0.05%)libsystem_kernel.dylib`semaphore_wait_trap (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::queue::Steal<T>::steal_into (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::park::Inner::park_condvar (1 samples, 0.05%)arvz`tokio::loom::std::parking_lot::Condvar::wait (1 samples, 0.05%)arvz`parking_lot::condvar::Condvar::wait (1 samples, 0.05%)arvz`parking_lot::condvar::Condvar::wait_until_internal (1 samples, 0.05%)arvz`parking_lot_core::parking_lot::park (1 samples, 0.05%)arvz`parking_lot_core::parking_lot::park::_{{closure}} (1 samples, 0.05%)arvz`<parking_lot_core::thread_parker::imp::ThreadParker as parking_lot_core::thread_parker::ThreadParkerT>::park (1 samples, 0.05%)libsystem_kernel.dylib`__psynch_cvwait (1 samples, 0.05%)arvz`core::time::Duration::from_millis (1 samples, 0.05%)arvz`core::time::Duration::new (1 samples, 0.05%)arvz`tokio::process::imp::GlobalOrphanQueue::reap_orphans (1 samples, 0.05%)arvz`tokio::process::imp::orphan::OrphanQueueImpl<T>::reap_orphans (1 samples, 0.05%)arvz`tokio::loom::std::parking_lot::Mutex<T>::try_lock (1 samples, 0.05%)arvz`lock_api::mutex::Mutex<R,T>::try_lock (1 samples, 0.05%)arvz`<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::try_lock (1 samples, 0.05%)arvz`core::sync::atomic::atomic_compare_exchange_weak (1 samples, 0.05%)arvz`<I as core::iter::traits::collect::IntoIterator>::into_iter (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (1 samples, 0.05%)arvz`core::result::Result<T,E>::map (2 samples, 0.10%)arvz`tokio::runtime::time::Driver::park_thread_timeout (22 samples, 1.10%)arvz`tokio::runtime::driver::IoStack::park_timeout (21 samples, 1.05%)arvz`tokio::runtime::process::Driver::park_timeout (21 samples, 1.05%)arvz`tokio::runtime::signal::Driver::park_timeout (20 samples, 1.00%)arvz`tokio::runtime::io::driver::Driver::park_timeout (20 samples, 1.00%)arvz`tokio::runtime::io::driver::Driver::turn (19 samples, 0.95%)arvz`mio::poll::Poll::poll (17 samples, 0.85%)libsystem_kernel.dylib`kevent (15 samples, 0.75%)arvz`core::mem::drop (1 samples, 0.05%)arvz`core::ptr::drop_in_place<core::cell::RefMut<core::option::Option<alloc::boxed::Box<tokio::runtime::scheduler::multi_thread::worker::Core>>>> (1 samples, 0.05%)arvz`<core::cell::BorrowRefMut as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`core::task::wake::Waker::wake (2 samples, 0.10%)arvz`tokio::runtime::task::waker::wake_by_val (2 samples, 0.10%)arvz`tokio::runtime::task::harness::_<impl tokio::runtime::task::raw::RawTask>::wake_by_val (2 samples, 0.10%)arvz`tokio::runtime::task::raw::RawTask::schedule (2 samples, 0.10%)arvz`tokio::runtime::task::raw::schedule (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::task::Schedule for alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle>>::schedule (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::with_current (2 samples, 0.10%)arvz`tokio::runtime::context::with_scheduler (2 samples, 0.10%)arvz`std::thread::local::LocalKey<T>::try_with (2 samples, 0.10%)arvz`tokio::runtime::context::with_scheduler::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::context::scoped::Scoped<T>::with (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::with_current::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task::_{{closure}} (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_local (1 samples, 0.05%)arvz`tokio::runtime::metrics::mock::MetricsBatch::inc_local_schedule_count (1 samples, 0.05%)arvz`tokio::runtime::time::wheel::Wheel::next_expiration (1 samples, 0.05%)arvz`tokio::runtime::time::wheel::Wheel::no_expirations_before (1 samples, 0.05%)arvz`tokio::runtime::time::wheel::level::Level::next_expiration (1 samples, 0.05%)arvz`tokio::runtime::time::entry::TimerHandle::mark_pending (1 samples, 0.05%)arvz`tokio::runtime::time::entry::TimerShared::set_cached_when (1 samples, 0.05%)arvz`core::sync::atomic::AtomicU64::store (1 samples, 0.05%)arvz`core::sync::atomic::atomic_store (1 samples, 0.05%)arvz`tokio::runtime::time::wheel::Wheel::poll (3 samples, 0.15%)arvz`tokio::runtime::time::wheel::Wheel::process_expiration (2 samples, 0.10%)arvz`tokio::runtime::time::wheel::Wheel::take_entries (1 samples, 0.05%)arvz`tokio::runtime::time::wheel::level::Level::take_slot (1 samples, 0.05%)arvz`<tokio::util::linked_list::LinkedList<L,<L as tokio::util::linked_list::Link>::Target> as core::default::Default>::default (1 samples, 0.05%)arvz`tokio::runtime::time::_<impl tokio::runtime::time::handle::Handle>::process_at_time (6 samples, 0.30%)arvz`tokio::runtime::time::wheel::Wheel::poll_at (1 samples, 0.05%)arvz`tokio::runtime::time::wheel::Wheel::next_expiration (1 samples, 0.05%)arvz`tokio::runtime::time::wheel::Wheel::no_expirations_before (1 samples, 0.05%)arvz`core::iter::range::_<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (1 samples, 0.05%)arvz`<usize as core::iter::range::Step>::forward_unchecked (1 samples, 0.05%)arvz`tokio::runtime::time::_<impl tokio::runtime::time::handle::Handle>::process (8 samples, 0.40%)arvz`tokio::runtime::time::source::TimeSource::now (1 samples, 0.05%)arvz`tokio::time::clock::Clock::now (1 samples, 0.05%)arvz`tokio::time::clock::now (1 samples, 0.05%)arvz`std::sys::unix::time::Timespec::now (1 samples, 0.05%)libsystem_c.dylib`clock_gettime (1 samples, 0.05%)libsystem_kernel.dylib`mach_absolute_time (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::park_timeout (33 samples, 1.65%)arvz`tokio::runtime::scheduler::multi_thread::park::Parker::park (33 samples, 1.65%)arvz`tokio::runtime::scheduler::multi_thread::park::Inner::park (33 samples, 1.65%)arvz`tokio::runtime::scheduler::multi_thread::park::Inner::park_driver (32 samples, 1.60%)arvz`tokio::runtime::driver::Driver::park (32 samples, 1.60%)arvz`tokio::runtime::driver::TimeDriver::park (32 samples, 1.60%)arvz`tokio::runtime::time::Driver::park (32 samples, 1.60%)arvz`tokio::runtime::time::Driver::park_internal (32 samples, 1.60%)arvz`tokio::time::clock::Clock::now (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::park (36 samples, 1.80%)a..arvz`tokio::runtime::scheduler::multi_thread::worker::Core::transition_from_parked (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::idle::Idle::unpark_worker_by_id (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::index::Index<I>>::index (1 samples, 0.05%)arvz`<usize as core::slice::index::SliceIndex<[T]>>::index (1 samples, 0.05%)arvz`hyper::proto::h1::dispatch::Dispatcher<D,Bs,I,T>::poll_flush (1 samples, 0.05%)arvz`hyper::proto::h1::io::Buffered<T,B>::poll_flush (1 samples, 0.05%)arvz`core::ptr::drop_in_place<hyper::body::body::Sender> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<futures_channel::mpsc::Sender<core::result::Result<bytes::bytes::Bytes,hyper::error::Error>>> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<core::option::Option<futures_channel::mpsc::BoundedSenderInner<core::result::Result<bytes::bytes::Bytes,hyper::error::Error>>>> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<futures_channel::mpsc::BoundedSenderInner<core::result::Result<bytes::bytes::Bytes,hyper::error::Error>>> (1 samples, 0.05%)arvz`<futures_channel::mpsc::BoundedSenderInner<T> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`futures_channel::mpsc::BoundedInner<T>::set_closed (1 samples, 0.05%)arvz`hyper::body::body::Sender::try_send_data (1 samples, 0.05%)arvz`futures_channel::mpsc::Sender<T>::try_send (1 samples, 0.05%)arvz`futures_channel::mpsc::BoundedSenderInner<T>::try_send (1 samples, 0.05%)arvz`futures_channel::mpsc::BoundedSenderInner<T>::do_send_b (1 samples, 0.05%)arvz`futures_channel::mpsc::BoundedSenderInner<T>::queue_push_and_signal (1 samples, 0.05%)arvz`futures_core::task::__internal::atomic_waker::AtomicWaker::wake (1 samples, 0.05%)arvz`core::task::wake::Waker::wake (1 samples, 0.05%)arvz`tokio::runtime::task::waker::wake_by_val (1 samples, 0.05%)arvz`tokio::runtime::task::harness::_<impl tokio::runtime::task::raw::RawTask>::wake_by_val (1 samples, 0.05%)arvz`tokio::runtime::task::raw::RawTask::schedule (1 samples, 0.05%)arvz`tokio::runtime::task::raw::schedule (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::task::Schedule for alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle>>::schedule (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::with_current (1 samples, 0.05%)arvz`tokio::runtime::context::with_scheduler (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::try_with (1 samples, 0.05%)arvz`tokio::runtime::context::with_scheduler::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::context::scoped::Scoped<T>::with (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::with_current::_{{closure}} (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task::_{{closure}} (1 samples, 0.05%)arvz`core::ptr::drop_in_place<core::cell::RefMut<core::option::Option<alloc::boxed::Box<tokio::runtime::scheduler::multi_thread::worker::Core>>>> (1 samples, 0.05%)arvz`<core::cell::BorrowRefMut as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<hyper::proto::h1::io::Buffered<T,B> as hyper::proto::h1::io::MemRead>::read_mem (1 samples, 0.05%)arvz`hyper::proto::h1::io::Buffered<T,B>::poll_read_from_io (1 samples, 0.05%)arvz`<reqwest::connect::Conn as tokio::io::async_read::AsyncRead>::poll_read (1 samples, 0.05%)arvz`<alloc::boxed::Box<T> as tokio::io::async_read::AsyncRead>::poll_read (1 samples, 0.05%)arvz`<reqwest::connect::native_tls_conn::NativeTlsConn<T> as tokio::io::async_read::AsyncRead>::poll_read (1 samples, 0.05%)arvz`<tokio_native_tls::TlsStream<S> as tokio::io::async_read::AsyncRead>::poll_read (1 samples, 0.05%)arvz`tokio_native_tls::TlsStream<S>::with_context (1 samples, 0.05%)arvz`<tokio_native_tls::TlsStream<S> as tokio::io::async_read::AsyncRead>::poll_read::_{{closure}} (1 samples, 0.05%)arvz`<native_tls::TlsStream<S> as std::io::Read>::read (1 samples, 0.05%)arvz`<native_tls::imp::TlsStream<S> as std::io::Read>::read (1 samples, 0.05%)arvz`<security_framework::secure_transport::SslStream<S> as std::io::Read>::read (1 samples, 0.05%)Security`SSLRead (1 samples, 0.05%)Security`SSLRecordReadInternal (1 samples, 0.05%)libcoretls.dylib`tls_record_decrypt (1 samples, 0.05%)libcoretls.dylib`SSLDecryptRecord (1 samples, 0.05%)libcoretls.dylib`CCSymmAEADDecrypt (1 samples, 0.05%)libcorecrypto.dylib`ccgcm_update (1 samples, 0.05%)libcorecrypto.dylib`Decrypt_Main_Loop (1 samples, 0.05%)arvz`hyper::proto::h1::conn::Conn<I,B,T>::poll_read_body (3 samples, 0.15%)arvz`hyper::proto::h1::decode::Decoder::decode (3 samples, 0.15%)arvz`hyper::proto::h1::decode::Decoder::decode::_{{closure}} (1 samples, 0.05%)arvz`tracing_core::event::Event::dispatch (1 samples, 0.05%)arvz`tracing_core::dispatcher::get_default (1 samples, 0.05%)arvz`tracing_core::event::Event::dispatch::_{{closure}} (1 samples, 0.05%)arvz`tracing_core::dispatcher::Dispatch::event (1 samples, 0.05%)arvz`<tracing_subscriber::layer::layered::Layered<L,S> as tracing_core::subscriber::Subscriber>::event_enabled (1 samples, 0.05%)arvz`<tracing_subscriber::layer::layered::Layered<L,S> as tracing_core::subscriber::Subscriber>::event_enabled (1 samples, 0.05%)arvz`<tracing_subscriber::registry::sharded::Registry as tracing_core::subscriber::Subscriber>::event_enabled (1 samples, 0.05%)arvz`tracing_subscriber::filter::layer_filters::FilterState::event_enabled (1 samples, 0.05%)arvz`std::thread::local::LocalKey<T>::try_with (1 samples, 0.05%)arvz`<hyper::proto::h1::dispatch::Client<B> as hyper::proto::h1::dispatch::Dispatch>::recv_msg (1 samples, 0.05%)arvz`hyper::proto::MessageHead<http::status::StatusCode>::into_response (1 samples, 0.05%)arvz`core::ptr::drop_in_place<http::header::map::HeaderMap> (1 samples, 0.05%)arvz`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`<futures_util::future::try_future::MapErr<Fut,F> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`<F as futures_core::future::TryFuture>::try_poll (8 samples, 0.40%)arvz`<hyper::client::conn::Connection<T,B> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`<hyper::client::conn::ProtoClient<T,B> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`<hyper::proto::h1::dispatch::Dispatcher<D,Bs,I,T> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`hyper::proto::h1::dispatch::Dispatcher<D,Bs,I,T>::poll_catch (8 samples, 0.40%)arvz`hyper::proto::h1::dispatch::Dispatcher<D,Bs,I,T>::poll_inner (8 samples, 0.40%)arvz`hyper::proto::h1::dispatch::Dispatcher<D,Bs,I,T>::poll_loop (8 samples, 0.40%)arvz`hyper::proto::h1::dispatch::Dispatcher<D,Bs,I,T>::poll_read (7 samples, 0.35%)arvz`hyper::proto::h1::dispatch::Dispatcher<D,Bs,I,T>::poll_read_head (2 samples, 0.10%)arvz`hyper::proto::h1::conn::Conn<I,B,T>::poll_read_head (1 samples, 0.05%)arvz`hyper::proto::h1::io::Buffered<T,B>::parse (1 samples, 0.05%)arvz`hyper::proto::h1::role::parse_headers (1 samples, 0.05%)arvz`httparse::ParserConfig::parse_response_with_uninit_headers (1 samples, 0.05%)arvz`<reqwest::async_impl::client::Pending as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<reqwest::async_impl::client::PendingRequest as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<hyper::client::client::ResponseFuture as core::future::future::Future>::poll (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::retryably_send_request::_{{closure}} (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::send_request::_{{closure}} (1 samples, 0.05%)arvz`hyper::client::client::Client<C,B>::connection_for::_{{closure}} (1 samples, 0.05%)arvz`<futures_util::future::select::Select<A,B> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`futures_util::future::future::FutureExt::poll_unpin (1 samples, 0.05%)arvz`<hyper::common::lazy::Lazy<F,R> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::either::Either<A,B> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::AndThen<Fut1,Fut2,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::TryFlatten<Fut1,Fut2> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::try_flatten::TryFlatten<Fut,<Fut as futures_core::future::TryFuture>::Ok> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::MapOk<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::MapErr<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<F as futures_core::future::TryFuture>::try_poll (1 samples, 0.05%)arvz`<hyper::service::oneshot::Oneshot<S,Req> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<core::pin::Pin<P> as core::future::future::Future>::poll (1 samples, 0.05%)arvz`reqwest::connect::with_timeout::_{{closure}} (1 samples, 0.05%)arvz`reqwest::connect::Connector::connect_with_maybe_proxy::_{{closure}} (1 samples, 0.05%)arvz`<hyper_tls::client::HttpsConnector<T> as tower_service::Service<http::uri::Uri>>::call (1 samples, 0.05%)arvz`http::uri::Uri::host (1 samples, 0.05%)arvz`core::option::Option<T>::map (1 samples, 0.05%)arvz`http::uri::Uri::host::_{{closure}} (1 samples, 0.05%)arvz`http::uri::authority::Authority::host (1 samples, 0.05%)arvz`http::uri::authority::host (1 samples, 0.05%)arvz`core::str::_<impl str>::rsplitn (1 samples, 0.05%)arvz`core::str::_<impl str>::split (1 samples, 0.05%)arvz`<serde_json::read::StrRead as serde_json::read::Read>::parse_str (1 samples, 0.05%)arvz`serde_json::read::SliceRead::parse_str_bytes (1 samples, 0.05%)arvz`core::result::Result<T,E>::map (1 samples, 0.05%)arvz`<core::marker::PhantomData<T> as serde::de::DeserializeSeed>::deserialize (2 samples, 0.10%)arvz`<arvz::models::task::_::<impl serde::de::Deserialize for arvz::models::task::Task>::deserialize::__Field as serde::de::Deserialize>::deserialize (2 samples, 0.10%)arvz`<serde_json::de::MapKey<R> as serde::de::Deserializer>::deserialize_identifier (2 samples, 0.10%)arvz`<serde_json::de::MapKey<R> as serde::de::Deserializer>::deserialize_any (2 samples, 0.10%)arvz`serde_json::de::Deserializer<R>::eat_char (1 samples, 0.05%)arvz`<serde_json::read::StrRead as serde_json::read::Read>::discard (1 samples, 0.05%)arvz`<serde_json::read::SliceRead as serde_json::read::Read>::discard (1 samples, 0.05%)arvz`serde::de::MapAccess::next_key (5 samples, 0.25%)arvz`<serde_json::de::MapAccess<R> as serde::de::MapAccess>::next_key_seed (5 samples, 0.25%)arvz`serde_json::de::Deserializer<R>::parse_whitespace (3 samples, 0.15%)arvz`serde_json::de::Deserializer<R>::peek (1 samples, 0.05%)arvz`serde::de::impls::_<impl serde::de::Deserialize for alloc::string::String>::deserialize (1 samples, 0.05%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_string (1 samples, 0.05%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_str (1 samples, 0.05%)arvz`<serde_json::read::StrRead as serde_json::read::Read>::parse_str (1 samples, 0.05%)arvz`serde_json::read::SliceRead::parse_str_bytes (1 samples, 0.05%)arvz`<serde_json::read::StrRead as serde_json::read::Read>::ignore_str (1 samples, 0.05%)arvz`<serde_json::read::SliceRead as serde_json::read::Read>::ignore_str (1 samples, 0.05%)arvz`arvz::models::task::_::_<impl serde::de::Deserialize for arvz::models::task::RenderedFields>::deserialize (3 samples, 0.15%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_struct (3 samples, 0.15%)arvz`<arvz::models::task::_::<impl serde::de::Deserialize for arvz::models::task::RenderedFields>::deserialize::__Visitor as serde::de::Visitor>::visit_map (3 samples, 0.15%)arvz`serde::de::MapAccess::next_value (3 samples, 0.15%)arvz`<serde_json::de::MapAccess<R> as serde::de::MapAccess>::next_value_seed (3 samples, 0.15%)arvz`<core::marker::PhantomData<T> as serde::de::DeserializeSeed>::deserialize (3 samples, 0.15%)arvz`<serde::de::ignored_any::IgnoredAny as serde::de::Deserialize>::deserialize (3 samples, 0.15%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_ignored_any (3 samples, 0.15%)arvz`serde_json::de::Deserializer<R>::ignore_value (3 samples, 0.15%)arvz`serde_json::de::Deserializer<R>::parse_whitespace (1 samples, 0.05%)arvz`core::result::Result<T,E>::map (1 samples, 0.05%)arvz`<serde::de::impls::OptionVisitor<T> as serde::de::Visitor>::visit_some (5 samples, 0.25%)arvz`serde::de::impls::_<impl serde::de::Deserialize for alloc::string::String>::deserialize (1 samples, 0.05%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_string (1 samples, 0.05%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_str (1 samples, 0.05%)arvz`<serde_json::read::StrRead as serde_json::read::Read>::parse_str (1 samples, 0.05%)arvz`serde_json::read::SliceRead::parse_str_bytes (1 samples, 0.05%)arvz`core::result::Result<T,E>::map (1 samples, 0.05%)arvz`<arvz::models::task::_::<impl serde::de::Deserialize for arvz::models::task::Task>::deserialize::__Visitor as serde::de::Visitor>::visit_map (13 samples, 0.65%)arvz`serde::de::MapAccess::next_value (8 samples, 0.40%)arvz`<serde_json::de::MapAccess<R> as serde::de::MapAccess>::next_value_seed (8 samples, 0.40%)arvz`<core::marker::PhantomData<T> as serde::de::DeserializeSeed>::deserialize (7 samples, 0.35%)arvz`serde::de::impls::_<impl serde::de::Deserialize for core::option::Option<T>>::deserialize (6 samples, 0.30%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_option (6 samples, 0.30%)arvz`serde_json::de::Deserializer<R>::parse_ident (1 samples, 0.05%)arvz`serde_json::de::Deserializer<R>::next_char (1 samples, 0.05%)arvz`<serde_json::read::StrRead as serde_json::read::Read>::next (1 samples, 0.05%)arvz`arvz::context_data::ContextData::get_deserialize (14 samples, 0.70%)arvz`<arvz::models::tasks::Tasks as arvz::models::model_airflow::ModelAirflow>::deserialize (14 samples, 0.70%)arvz`serde_json::de::from_str (14 samples, 0.70%)arvz`serde_json::de::from_trait (14 samples, 0.70%)arvz`arvz::models::tasks::_::_<impl serde::de::Deserialize for arvz::models::tasks::Tasks>::deserialize (14 samples, 0.70%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_struct (14 samples, 0.70%)arvz`<arvz::models::tasks::_::<impl serde::de::Deserialize for arvz::models::tasks::Tasks>::deserialize::__Visitor as serde::de::Visitor>::visit_map (14 samples, 0.70%)arvz`serde::de::MapAccess::next_value (14 samples, 0.70%)arvz`<serde_json::de::MapAccess<R> as serde::de::MapAccess>::next_value_seed (14 samples, 0.70%)arvz`<core::marker::PhantomData<T> as serde::de::DeserializeSeed>::deserialize (14 samples, 0.70%)arvz`serde::de::impls::_<impl serde::de::Deserialize for alloc::vec::Vec<T>>::deserialize (14 samples, 0.70%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_seq (14 samples, 0.70%)arvz`<serde::de::impls::<impl serde::de::Deserialize for alloc::vec::Vec<T>>::deserialize::VecVisitor<T> as serde::de::Visitor>::visit_seq (14 samples, 0.70%)arvz`serde::de::SeqAccess::next_element (14 samples, 0.70%)arvz`<serde_json::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed (14 samples, 0.70%)arvz`<core::marker::PhantomData<T> as serde::de::DeserializeSeed>::deserialize (14 samples, 0.70%)arvz`arvz::models::task::_::_<impl serde::de::Deserialize for arvz::models::task::Task>::deserialize (14 samples, 0.70%)arvz`<&mut serde_json::de::Deserializer<R> as serde::de::Deserializer>::deserialize_struct (14 samples, 0.70%)arvz`<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.05%)arvz`reqwest::async_impl::request::RequestBuilder::basic_auth (1 samples, 0.05%)arvz`reqwest::util::basic_auth (1 samples, 0.05%)arvz`std::io::Write::write_fmt (1 samples, 0.05%)arvz`core::fmt::write (1 samples, 0.05%)arvz`<&T as core::fmt::Display>::fmt (1 samples, 0.05%)arvz`<alloc::string::String as core::fmt::Display>::fmt (1 samples, 0.05%)arvz`<std::io::Write::write_fmt::Adapter<T> as core::fmt::Write>::write_str (1 samples, 0.05%)arvz`std::io::Write::write_all (1 samples, 0.05%)arvz`<base64::write::encoder::EncoderWriter<E,W> as std::io::Write>::write (1 samples, 0.05%)arvz`<base64::engine::general_purpose::GeneralPurpose as base64::engine::Engine>::internal_encode (1 samples, 0.05%)arvz`alloc::borrow::Cow<B>::into_owned (1 samples, 0.05%)arvz`alloc::str::_<impl alloc::borrow::ToOwned for str>::to_owned (1 samples, 0.05%)libsystem_platform.dylib`_platform_memmove (1 samples, 0.05%)arvz`arvz::app::App::run::_{{closure}}::_{{closure}} (18 samples, 0.90%)arvz`arvz::context_data::ContextData::refresh::_{{closure}} (18 samples, 0.90%)arvz`reqwest::async_impl::response::Response::text::_{{closure}} (2 samples, 0.10%)arvz`reqwest::async_impl::response::Response::text_with_charset::_{{closure}} (2 samples, 0.10%)arvz`reqwest::async_impl::response::Response::bytes::_{{closure}} (1 samples, 0.05%)arvz`hyper::body::to_bytes::to_bytes::_{{closure}} (1 samples, 0.05%)arvz`<alloc::vec::Vec<u8> as bytes::buf::buf_mut::BufMut>::put (1 samples, 0.05%)arvz`alloc::vec::Vec<T,A>::reserve (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.05%)arvz`alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.05%)arvz`alloc::raw_vec::finish_grow (1 samples, 0.05%)arvz`<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.05%)arvz`alloc::alloc::Global::grow_impl (1 samples, 0.05%)libsystem_malloc.dylib`_realloc (1 samples, 0.05%)libsystem_malloc.dylib`_malloc_zone_realloc (1 samples, 0.05%)libsystem_malloc.dylib`szone_realloc (1 samples, 0.05%)libsystem_malloc.dylib`szone_malloc_should_clear (1 samples, 0.05%)libsystem_malloc.dylib`medium_malloc_should_clear (1 samples, 0.05%)arvz`parking_lot_core::parking_lot::park (1 samples, 0.05%)arvz`core::cell::Cell<T>::set (1 samples, 0.05%)arvz`<futures_util::future::future::fuse::Fuse<Fut> as core::future::future::Future>::poll (3 samples, 0.15%)arvz`<futures_util::stream::stream::next::Next<St> as core::future::future::Future>::poll (3 samples, 0.15%)arvz`futures_util::stream::stream::StreamExt::poll_next_unpin (3 samples, 0.15%)arvz`<crossterm::event::stream::EventStream as futures_core::stream::Stream>::poll_next (3 samples, 0.15%)arvz`crossterm::event::poll_internal (3 samples, 0.15%)arvz`crossterm::event::try_lock_internal_event_reader_for (3 samples, 0.15%)arvz`lock_api::mutex::Mutex<R,T>::try_lock_for (3 samples, 0.15%)arvz`<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutexTimed>::try_lock_for (3 samples, 0.15%)arvz`parking_lot::raw_mutex::RawMutex::lock_slow (3 samples, 0.15%)arvz`parking_lot_core::spinwait::SpinWait::spin (2 samples, 0.10%)arvz`parking_lot_core::thread_parker::imp::thread_yield (2 samples, 0.10%)libsystem_kernel.dylib`swtch_pri (2 samples, 0.10%)arvz`<tokio_util::sync::cancellation_token::WaitForCancellationFuture as core::future::future::Future>::poll (1 samples, 0.05%)arvz`<&mut T as core::ops::deref::Deref>::deref (1 samples, 0.05%)arvz`core::sync::atomic::AtomicUsize::compare_exchange (2 samples, 0.10%)arvz`core::sync::atomic::atomic_compare_exchange (2 samples, 0.10%)arvz`tokio::runtime::time::entry::StateCell::poll (3 samples, 0.15%)arvz`tokio::sync::task::atomic_waker::AtomicWaker::register_by_ref (3 samples, 0.15%)arvz`tokio::sync::task::atomic_waker::AtomicWaker::do_register (3 samples, 0.15%)arvz`tokio::sync::task::atomic_waker::AtomicWaker::do_register::catch_unwind (1 samples, 0.05%)arvz`std::panic::catch_unwind (1 samples, 0.05%)arvz`std::panicking::try (1 samples, 0.05%)arvz`__rust_try (1 samples, 0.05%)arvz`std::panicking::try::do_call (1 samples, 0.05%)arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (1 samples, 0.05%)arvz`tokio::sync::task::atomic_waker::AtomicWaker::do_register::_{{closure}} (1 samples, 0.05%)arvz`core::mem::drop (1 samples, 0.05%)arvz`core::ptr::drop_in_place<core::option::Option<core::task::wake::Waker>> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<core::task::wake::Waker> (1 samples, 0.05%)arvz`<core::task::wake::Waker as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`tokio::runtime::task::waker::drop_waker (1 samples, 0.05%)arvz`tokio::runtime::task::harness::_<impl tokio::runtime::task::raw::RawTask>::drop_reference (1 samples, 0.05%)arvz`tokio::runtime::task::state::State::ref_dec (1 samples, 0.05%)arvz`tokio::runtime::driver::IoHandle::unpark (2 samples, 0.10%)arvz`tokio::runtime::io::driver::Handle::unpark (2 samples, 0.10%)arvz`mio::waker::Waker::wake (2 samples, 0.10%)arvz`mio::sys::unix::waker::kqueue::Waker::wake (2 samples, 0.10%)libsystem_kernel.dylib`kevent (2 samples, 0.10%)arvz`<core::pin::Pin<P> as core::future::future::Future>::poll (7 samples, 0.35%)arvz`<tokio::time::sleep::Sleep as core::future::future::Future>::poll (7 samples, 0.35%)arvz`tokio::time::sleep::Sleep::poll_elapsed (7 samples, 0.35%)arvz`tokio::runtime::time::entry::TimerEntry::poll_elapsed (7 samples, 0.35%)arvz`tokio::runtime::time::entry::TimerEntry::reset (3 samples, 0.15%)arvz`tokio::runtime::time::_<impl tokio::runtime::time::handle::Handle>::reregister (3 samples, 0.15%)arvz`tokio::runtime::time::wheel::Wheel::insert (1 samples, 0.05%)arvz`tokio::runtime::time::wheel::level::Level::add_entry (1 samples, 0.05%)arvz`tokio::util::linked_list::LinkedList<L,<L as tokio::util::linked_list::Link>::Target>::push_front (1 samples, 0.05%)arvz`<tokio::runtime::time::entry::TimerShared as tokio::util::linked_list::Link>::pointers (1 samples, 0.05%)arvz`tokio::runtime::time::entry::TimerShared::addr_of_pointers (1 samples, 0.05%)arvz`<tokio::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (12 samples, 0.60%)arvz`arvz::tui::Tui::start::_{{closure}}::_{{closure}} (12 samples, 0.60%)arvz`tokio::time::interval::Interval::tick::_{{closure}} (8 samples, 0.40%)arvz`<tokio::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (8 samples, 0.40%)arvz`tokio::time::interval::Interval::tick::_{{closure}}::_{{closure}} (8 samples, 0.40%)arvz`tokio::time::interval::Interval::poll_tick (8 samples, 0.40%)arvz`tokio::time::sleep::Sleep::reset_without_reregister (1 samples, 0.05%)arvz`tokio::runtime::time::entry::TimerEntry::reset (1 samples, 0.05%)arvz`tokio::runtime::time::source::TimeSource::deadline_to_tick (1 samples, 0.05%)arvz`core::time::Duration::new (1 samples, 0.05%)arvz`core::ptr::drop_in_place<(tokio_util::sync::cancellation_token::WaitForCancellationFuture,futures_util::future::future::fuse::Fuse<futures_util::stream::stream::next::Next<crossterm::event::stream::EventStream>>,tokio::time::interval::Interval::tick::{{closure}},tokio::time::interval::Interval::tick::{{closure}},tokio::time::interval::Interval::tick::{{closure}})> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<tokio_util::sync::cancellation_token::WaitForCancellationFuture> (1 samples, 0.05%)arvz`core::ptr::drop_in_place<tokio::sync::notify::Notified> (1 samples, 0.05%)arvz`<tokio::sync::notify::Notified as core::ops::drop::Drop>::drop (1 samples, 0.05%)arvz`tokio::util::linked_list::LinkedList<L,<L as tokio::util::linked_list::Link>::Target>::remove (1 samples, 0.05%)arvz`tokio::sync::mpsc::list::Tx<T>::push (1 samples, 0.05%)arvz`tokio::sync::mpsc::list::Tx<T>::find_block (1 samples, 0.05%)arvz`alloc::sync::Arc<T>::from_raw (1 samples, 0.05%)arvz`<parking_lot_core::thread_parker::imp::UnparkHandle as parking_lot_core::thread_parker::UnparkHandleT>::unpark (2 samples, 0.10%)libsystem_kernel.dylib`__psynch_cvsignal (2 samples, 0.10%)arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run_task (44 samples, 2.20%)a..arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run_task::_{{closure}} (44 samples, 2.20%)a..arvz`tokio::runtime::task::LocalNotified<S>::run (44 samples, 2.20%)a..arvz`tokio::runtime::task::raw::RawTask::poll (44 samples, 2.20%)a..arvz`tokio::runtime::task::raw::poll (44 samples, 2.20%)a..arvz`tokio::runtime::task::harness::Harness<T,S>::poll (44 samples, 2.20%)a..arvz`tokio::runtime::task::harness::Harness<T,S>::poll_inner (44 samples, 2.20%)a..arvz`tokio::runtime::task::harness::poll_future (44 samples, 2.20%)a..arvz`std::panic::catch_unwind (44 samples, 2.20%)a..arvz`std::panicking::try (44 samples, 2.20%)a..arvz`__rust_try (44 samples, 2.20%)a..arvz`std::panicking::try::do_call (44 samples, 2.20%)a..arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (44 samples, 2.20%)a..arvz`tokio::runtime::task::harness::poll_future::_{{closure}} (44 samples, 2.20%)a..arvz`tokio::runtime::task::core::Core<T,S>::poll (44 samples, 2.20%)a..arvz`tokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (44 samples, 2.20%)a..arvz`arvz::tui::Tui::start::_{{closure}} (18 samples, 0.90%)arvz`tokio::sync::mpsc::unbounded::UnboundedSender<T>::send (5 samples, 0.25%)arvz`tokio::sync::mpsc::chan::Tx<T,S>::send (5 samples, 0.25%)arvz`tokio::sync::mpsc::chan::Chan<T,S>::send (5 samples, 0.25%)arvz`tokio::sync::task::atomic_waker::AtomicWaker::wake (4 samples, 0.20%)arvz`core::task::wake::Waker::wake (4 samples, 0.20%)arvz`tokio::runtime::park::wake (4 samples, 0.20%)arvz`tokio::runtime::park::Inner::unpark (3 samples, 0.15%)arvz`tokio::loom::std::parking_lot::Condvar::notify_one (3 samples, 0.15%)arvz`parking_lot::condvar::Condvar::notify_one (3 samples, 0.15%)arvz`parking_lot::condvar::Condvar::notify_one_slow (3 samples, 0.15%)arvz`parking_lot_core::parking_lot::unpark_requeue (3 samples, 0.15%)arvz`parking_lot_core::parking_lot::FairTimeout::should_timeout (1 samples, 0.05%)arvz`std::sys::unix::time::Timespec::now (1 samples, 0.05%)libsystem_c.dylib`clock_gettime (1 samples, 0.05%)libsystem_kernel.dylib`mach_absolute_time (1 samples, 0.05%)arvz`tokio::loom::std::atomic_u32::AtomicU32::unsync_load (1 samples, 0.05%)arvz`core::sync::atomic::atomic_load (1 samples, 0.05%)arvz`core::sync::atomic::AtomicU32::load (1 samples, 0.05%)arvz`tokio::runtime::scheduler::multi_thread::worker::Core::steal_work (3 samples, 0.15%)arvz`tokio::runtime::scheduler::multi_thread::queue::Steal<T>::steal_into (3 samples, 0.15%)arvz`tokio::runtime::scheduler::multi_thread::queue::Steal<T>::steal_into2 (2 samples, 0.10%)arvz`core::sync::atomic::AtomicU64::load (1 samples, 0.05%)arvz`core::sync::atomic::atomic_load (1 samples, 0.05%)all (2,000 samples, 100%)libsystem_pthread.dylib`thread_start (87 samples, 4.35%)libsy..libsystem_pthread.dylib`_pthread_start (87 samples, 4.35%)libsy..arvz`std::sys::unix::thread::Thread::new::thread_start (87 samples, 4.35%)arvz`..arvz`core::ops::function::FnOnce::call_once{{vtable.shim}} (87 samples, 4.35%)arvz`..arvz`std::thread::Builder::spawn_unchecked_::_{{closure}} (87 samples, 4.35%)arvz`..arvz`std::panicking::try (87 samples, 4.35%)arvz`..arvz`__rust_try (87 samples, 4.35%)arvz`..arvz`std::panicking::try::do_call (87 samples, 4.35%)arvz`..arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (87 samples, 4.35%)arvz`..arvz`std::thread::Builder::spawn_unchecked_::_{{closure}}::_{{closure}} (87 samples, 4.35%)arvz`..arvz`std::sys_common::backtrace::__rust_begin_short_backtrace (87 samples, 4.35%)arvz`..arvz`tokio::runtime::blocking::pool::Spawner::spawn_thread::_{{closure}} (86 samples, 4.30%)arvz`..arvz`tokio::runtime::blocking::pool::Inner::run (86 samples, 4.30%)arvz`..arvz`tokio::runtime::blocking::pool::Task::run (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::UnownedTask<S>::run (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::raw::RawTask::poll (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::raw::poll (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::harness::Harness<T,S>::poll (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::harness::Harness<T,S>::poll_inner (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::harness::poll_future (86 samples, 4.30%)arvz`..arvz`std::panic::catch_unwind (86 samples, 4.30%)arvz`..arvz`std::panicking::try (86 samples, 4.30%)arvz`..arvz`__rust_try (86 samples, 4.30%)arvz`..arvz`std::panicking::try::do_call (86 samples, 4.30%)arvz`..arvz`<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::harness::poll_future::_{{closure}} (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::core::Core<T,S>::poll (86 samples, 4.30%)arvz`..arvz`tokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (86 samples, 4.30%)arvz`..arvz`<tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll (86 samples, 4.30%)arvz`..arvz`tokio::runtime::scheduler::multi_thread::worker::Launch::launch::_{{closure}} (86 samples, 4.30%)arvz`..arvz`tokio::runtime::scheduler::multi_thread::worker::run (86 samples, 4.30%)arvz`..arvz`tokio::runtime::context::runtime::enter_runtime (86 samples, 4.30%)arvz`..arvz`tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}} (86 samples, 4.30%)arvz`..arvz`tokio::runtime::context::set_scheduler (86 samples, 4.30%)arvz`..arvz`std::thread::local::LocalKey<T>::with (86 samples, 4.30%)arvz`..arvz`std::thread::local::LocalKey<T>::try_with (86 samples, 4.30%)arvz`..arvz`tokio::runtime::context::set_scheduler::_{{closure}} (86 samples, 4.30%)arvz`..arvz`tokio::runtime::context::scoped::Scoped<T>::set (86 samples, 4.30%)arvz`..arvz`tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}}::_{{closure}} (86 samples, 4.30%)arvz`..arvz`tokio::runtime::scheduler::multi_thread::worker::Context::run (86 samples, 4.30%)arvz`..arvz`tokio::runtime::scheduler::multi_thread::worker::Core::transition_from_searching (1 samples, 0.05%) \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 2b4daed..d339693 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ pub mod app; pub mod cli; pub mod components; pub mod config; +mod context_data; pub mod main_layout; pub mod mode; pub mod models; diff --git a/src/main_layout.rs b/src/main_layout.rs index dbb464d..4e154dc 100644 --- a/src/main_layout.rs +++ b/src/main_layout.rs @@ -7,9 +7,10 @@ use ratatui::Frame; use std::cell::RefCell; use std::rc::Rc; +#[derive(Debug)] pub enum Chunk { Context(usize), - Command, + CommandChunk, Table, Status, } @@ -64,7 +65,6 @@ impl MainLayout { Layout::default() .direction(Direction::Vertical) .constraints(self.get_constraints(mode)) - .margin(1) .split(*tui_size.borrow_mut()), ); } @@ -100,10 +100,10 @@ impl MainLayout { } } - pub fn get_chunk(&self, chunk: Chunk) -> Rect { + pub fn get_chunk(&self, chunk: &Chunk) -> Rect { match chunk { - Chunk::Context(area) => self.context_chunk.clone().unwrap()[area], - Chunk::Command => self.command_chunk.clone().unwrap()[0], + Chunk::Context(area) => self.context_chunk.clone().unwrap()[*area], + Chunk::CommandChunk => self.command_chunk.clone().unwrap()[0], Chunk::Table => self.table_chunk.clone().unwrap()[0], Chunk::Status => self.status_chunk.clone().unwrap()[0], } diff --git a/src/mode.rs b/src/mode.rs index e2627a1..fb4f4bc 100644 --- a/src/mode.rs +++ b/src/mode.rs @@ -13,6 +13,7 @@ pub enum Mode { Log, Code, Command, + Pool, } pub type RefreshLayoutFnType = Option>>; @@ -31,7 +32,7 @@ impl Default for ObservableMode { impl ObservableMode { pub fn new() -> Self { ObservableMode { - mode: Mode::DagRun, + mode: Mode::Pool, refresh_layout_fn: None, } } @@ -53,4 +54,18 @@ impl ObservableMode { (refresh_fn.borrow_mut())(mode); } } + + pub fn set_next_mode(&mut self, mode: Mode) { + self.mode = self.get_next_mode(mode); + if let Some(refresh_fn) = &self.refresh_layout_fn { + (refresh_fn.borrow_mut())(mode); + } + } + + pub fn get_next_mode(&self, mode: Mode) -> Mode { + match mode { + Mode::Pool => Mode::Task, + _ => self.get(), + } + } } diff --git a/src/models/dag_run.rs b/src/models/dag_run.rs index 41ded49..ee2cb9f 100644 --- a/src/models/dag_run.rs +++ b/src/models/dag_run.rs @@ -1,5 +1,6 @@ use crate::config::Airflow; use crate::models::conf::Conf; +use crate::models::model_airflow::Data; use crate::models::tasks::Tasks; use color_eyre::eyre::Result; use reqwest::{Client, StatusCode}; @@ -72,3 +73,9 @@ impl DagRun { Ok(String::from("")) } } + +impl Data for DagRun { + fn get_id(&self) -> &str { + &self.dag_id + } +} diff --git a/src/models/dag_runs.rs b/src/models/dag_runs.rs index 66812b6..f6d33af 100644 --- a/src/models/dag_runs.rs +++ b/src/models/dag_runs.rs @@ -1,5 +1,7 @@ use crate::config::Airflow; use crate::models::dag_run::DagRun; +use crate::models::model_airflow::Data; +use crate::models::model_airflow::ModelAirflow; use crate::models::tasks::Tasks; use crate::style; use color_eyre::eyre::Result; @@ -12,144 +14,42 @@ use serde::Deserialize; #[derive(Deserialize, Debug, Default, Clone)] pub struct DagRuns { pub(crate) dag_runs: Vec, - total_entries: u32, + total_entries: i32, } -impl DagRuns { - pub fn new() -> Self { - Self { - dag_runs: vec![], - total_entries: 0, - } - } - - pub async fn set_dag_runs( - &mut self, - client: &Client, - username: &str, - password: &str, - url: &str, - ) -> Result<()> { - let dag_runs: DagRuns = client - .get(format!( - "{}/api/v1/dags/~/dagRuns?order_by=-start_date", - url - )) - .basic_auth(username, Some(password)) - .send() - .await? - .json::() - .await?; - - self.dag_runs = dag_runs.dag_runs; - self.total_entries = dag_runs.total_entries; - Ok(()) +impl ModelAirflow for DagRuns { + fn get_endpoint(&self, params: Option) -> String { + String::from("/taskinstance/list/?_flt_3_pool=default_pool") } - pub async fn get_task( - &mut self, - client: &Client, - cfg_airflow: &Airflow, - username: &str, - password: &str, - url: &str, - index: usize, - ) -> Result { - let task: Tasks = client - .get(format!( - "{}/api/v1/dags/{}/dagRuns/{}/taskInstances", - &cfg_airflow.host, self.dag_runs[index].dag_id, self.dag_runs[index].dag_run_id - )) - .basic_auth(&cfg_airflow.username, Some(&cfg_airflow.password)) - .send() - .await? - .json::() - .await?; - Ok(task) + fn deserialize(&mut self, res: &str) { + *self = serde_json::from_str::(res).expect("rgge"); } - pub fn get_total_entries(&self) -> u32 { + fn get_total_entries(&self) -> i32 { self.total_entries } - pub fn get_count_dag_run_running(&self) -> u32 { - self.dag_runs - .iter() - .filter(|dag_run| dag_run.state == "running") - .count() as u32 - } - - pub fn get_count_dag_run_failed(&self) -> u32 { - self.dag_runs - .iter() - .filter(|dag_run| dag_run.state == "failed") - .count() as u32 - } - - pub fn get_count_dag_run_scheduled(&self) -> u32 { - self.dag_runs - .iter() - .filter(|dag_run| dag_run.state == "scheduled") - .count() as u32 - } - - pub fn get_count_dag_run_success(&self) -> u32 { - self.dag_runs - .iter() - .filter(|dag_run| dag_run.state == "success") - .count() as u32 - } - - pub fn get_count_dag_run_queued(&self) -> u32 { - self.dag_runs - .iter() - .filter(|dag_run| dag_run.state == "queued") - .count() as u32 - } - - pub fn filter_runs_by_dag_id<'a>(&'a self, dag_id: &str) -> Vec<&'a DagRun> { - self.dag_runs - .iter() - .filter(|dag_run| dag_run.dag_id.contains(dag_id)) - .collect::>() - } - - pub fn get_dag_runs_rows_filtered(&self, dag_id: &str) -> Vec { + fn get_rows(&self) -> Vec { let mut rows: Vec = Vec::new(); - let filtered_dag_runs: Vec<&DagRun> = self.filter_runs_by_dag_id(dag_id); - - for dag_run in filtered_dag_runs { - rows.push( - Row::new(vec![ - dag_run.dag_id.clone(), - dag_run.state.clone(), - dag_run.data_interval_start.clone(), - dag_run.data_interval_end.clone(), - dag_run.run_type.clone(), - dag_run.external_trigger.to_string().clone(), - ]) - .style(style::get_style_row(&dag_run.state)), - ); + for dag_run in &self.dag_runs { + rows.push(Row::new(vec![ + dag_run.dag_id.to_string(), + dag_run.state.to_string(), + dag_run.data_interval_start.to_string(), + dag_run.data_interval_end.to_string(), + dag_run.run_type.to_string(), + dag_run.external_trigger.to_string(), + ])); } rows } - pub fn get_dag_runs_rows_context(&self) -> Vec { - let mut rows: Vec = Vec::new(); + fn get_element(&self, id: usize) -> Option> { + Some(Box::new(&self.dag_runs[id])) + } - for dag_run in &self.dag_runs { - rows.push( - Row::new(vec![ - dag_run.dag_id.clone(), - dag_run.state.clone(), - dag_run.data_interval_start.clone(), - dag_run.data_interval_end.clone(), - dag_run.run_type.clone(), - dag_run.external_trigger.to_string().clone(), - ]) - .style(style::get_style_row(&dag_run.state)), - ); - } - rows + fn get_view_model(&self) -> super::model_airflow::ModelView { + todo!() } } diff --git a/src/models/mod.rs b/src/models/mod.rs index eafe1c1..1f2b9b7 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -3,5 +3,7 @@ pub mod dag; pub mod dag_run; pub mod dag_runs; mod log; +pub mod model_airflow; +pub mod pool; mod task; pub mod tasks; diff --git a/src/models/model_airflow.rs b/src/models/model_airflow.rs new file mode 100644 index 0000000..cfac2c6 --- /dev/null +++ b/src/models/model_airflow.rs @@ -0,0 +1,29 @@ +use color_eyre::Result; +use ratatui::layout::Rows; +use ratatui::widgets::Row; +use reqwest::{Error, Response}; +use std::fmt::Debug; +use std::future::Future; + +pub trait Data { + fn get_id(&self) -> &str; +} + +pub struct ModelView<'a> { + pub(crate) rows: Vec>, +} + +pub trait ModelAirflow: Send { + fn get_endpoint(&self, params: Option) -> String; + fn deserialize(&mut self, res: &str); + fn get_total_entries(&self) -> i32; + fn get_rows(&self) -> Vec; + fn get_element(&self, id: usize) -> Option>; + fn get_view_model(&self) -> ModelView; +} + +impl Debug for dyn ModelAirflow { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{:?}", self) + } +} diff --git a/src/models/model_view.rs b/src/models/model_view.rs new file mode 100644 index 0000000..f62d698 --- /dev/null +++ b/src/models/model_view.rs @@ -0,0 +1,11 @@ +pub struct ModelView { + content: T, +} + +impl ModelView {} + +impl ModelView { + pub fn new(content: T) -> Self { + Self { content } + } +} diff --git a/src/models/pool.rs b/src/models/pool.rs new file mode 100644 index 0000000..61789d3 --- /dev/null +++ b/src/models/pool.rs @@ -0,0 +1,84 @@ +use crate::models::model_airflow::Data; +use crate::models::model_airflow::ModelAirflow; +use crate::models::model_airflow::ModelView; +use ratatui::widgets::Row; +use reqwest::{Error, Response}; +use serde::Deserialize; +use std::future::Future; + +#[derive(Debug, Deserialize)] +pub struct Pool { + deferred_slots: i32, + description: Option, + include_deferred: bool, + name: String, + occupied_slots: i32, + open_slots: i32, + queued_slots: i32, + running_slots: i32, + scheduled_slots: i32, + slots: i32, +} + +impl Data for Pool { + fn get_id(&self) -> &str { + &self.name + } +} + +#[derive(Debug, Deserialize)] +pub struct PoolCollection { + pools: Vec, + total_entries: i32, +} + +impl PoolCollection { + pub fn new() -> PoolCollection { + PoolCollection { + pools: vec![], + total_entries: 0, + } + } +} + +impl ModelAirflow for PoolCollection { + fn get_endpoint(&self, params: Option) -> String { + String::from("/api/v1/pools") + } + + fn deserialize(&mut self, res: &str) { + *self = serde_json::from_str::(res).expect("rgge"); + } + + fn get_total_entries(&self) -> i32 { + self.total_entries + } + + fn get_rows(&self) -> Vec { + let mut rows: Vec = Vec::new(); + for pool in &self.pools { + rows.push(Row::new(vec![ + pool.deferred_slots.to_string(), + pool.include_deferred.to_string(), + pool.name.to_string(), + pool.occupied_slots.to_string(), + pool.open_slots.to_string(), + pool.queued_slots.to_string(), + pool.running_slots.to_string(), + pool.scheduled_slots.to_string(), + pool.slots.to_string(), + ])); + } + rows + } + + fn get_element(&self, id: usize) -> Option> { + Some(Box::new(&self.pools[id])) + } + + fn get_view_model(&self) -> super::model_airflow::ModelView { + ModelView { + rows: self.get_rows(), + } + } +} diff --git a/src/models/task.rs b/src/models/task.rs index 79c4e16..bf86304 100644 --- a/src/models/task.rs +++ b/src/models/task.rs @@ -1,5 +1,6 @@ use crate::config::Airflow; use crate::models::log::Log; +use crate::models::model_airflow::Data; use color_eyre::eyre::Result; use reqwest::Client; use serde::Deserialize; @@ -131,3 +132,9 @@ impl Task { Ok(logs) } } + +impl Data for Task { + fn get_id(&self) -> &str { + &self.task_id + } +} diff --git a/src/models/tasks.rs b/src/models/tasks.rs index b34a50d..1143513 100644 --- a/src/models/tasks.rs +++ b/src/models/tasks.rs @@ -1,5 +1,7 @@ use crate::config::Airflow; use crate::models::dag_runs::DagRuns; +use crate::models::model_airflow::Data; +use crate::models::model_airflow::ModelAirflow; use crate::models::task::Task; use crate::style; use color_eyre::eyre::Result; @@ -7,25 +9,41 @@ use ratatui::widgets::Row; use reqwest::Client; use serde::Deserialize; +use super::model_airflow::ModelView; + #[derive(Debug, Default, Deserialize)] pub struct Tasks { pub task_instances: Vec, - pub total_entries: u32, + pub total_entries: i32, } impl Tasks { - pub fn new() -> Result { - Ok(Self { + pub fn new() -> Tasks { + Tasks { task_instances: vec![], total_entries: 0, - }) + } } +} - pub fn get_total_entries(&self) -> u32 { +impl ModelAirflow for Tasks { + fn get_endpoint(&self, params: Option) -> String { + let mut endpoint = String::from("/api/v1/dags/~/dagRuns/~/taskInstances"); + if let Some(params) = params { + endpoint.push_str(format!("?pool={}", params).as_str()); + } + endpoint + } + + fn deserialize(&mut self, res: &str) { + *self = serde_json::from_str::(res).expect("rgge"); + } + + fn get_total_entries(&self) -> i32 { self.total_entries } - pub fn get_tasks_row(&self) -> Vec { + fn get_rows(&self) -> Vec { let mut rows: Vec = Vec::new(); for task in &self.task_instances { @@ -55,4 +73,14 @@ impl Tasks { } rows } + + fn get_element(&self, id: usize) -> Option> { + Some(Box::new(&self.task_instances[id])) + } + + fn get_view_model(&self) -> super::model_airflow::ModelView { + ModelView { + rows: self.get_rows(), + } + } } diff --git a/src/tui.rs b/src/tui.rs index fc24acb..3f145f4 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -28,7 +28,7 @@ pub fn io() -> IO { } pub type Frame<'a> = ratatui::Frame<'a>; -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] pub enum Event { Init, Quit, @@ -42,6 +42,7 @@ pub enum Event { Key(KeyEvent), Mouse(MouseEvent), Resize(u16, u16), + Refresh, } pub struct Tui { @@ -54,6 +55,7 @@ pub struct Tui { pub tick_rate: f64, pub mouse: bool, pub paste: bool, + pub current_event: Option, } impl Tui { @@ -76,6 +78,7 @@ impl Tui { tick_rate, mouse, paste, + current_event: None, }) } @@ -110,6 +113,7 @@ impl Tui { let mut reader = crossterm::event::EventStream::new(); let mut tick_interval = tokio::time::interval(tick_delay); let mut render_interval = tokio::time::interval(render_delay); + let mut refresh_interval = tokio::time::interval(Duration::from_secs(5)); _event_tx.send(Event::Init).unwrap(); loop { let tick_delay = tick_interval.tick(); @@ -157,6 +161,9 @@ impl Tui { _ = render_delay => { _event_tx.send(Event::Render).unwrap(); }, + _ = refresh_interval.tick() => { + _event_tx.send(Event::Refresh).unwrap(); + }, } } }); @@ -225,7 +232,9 @@ impl Tui { } pub async fn next(&mut self) -> Option { - self.event_rx.recv().await + let event = self.event_rx.recv().await; + self.current_event = event.clone(); + event } pub fn get_main_constraint(&self, mode: Mode) -> [Constraint; 4] { diff --git a/src/utils.rs b/src/utils.rs index 8403119..286be84 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,4 +1,6 @@ -use std::path::PathBuf; +use core::panic; +use std::rc::Rc; +use std::{cell::RefCell, path::PathBuf}; use color_eyre::eyre::Result; use crossterm::event::KeyCode; @@ -10,6 +12,9 @@ use tracing_subscriber::{ self, prelude::__tracing_subscriber_SubscriberExt, util::SubscriberInitExt, Layer, }; +use crate::components::status_bar::StatusBar; +use crate::components::{context_informations::ContextInformation, shortcut::Shortcut, Component}; + const VERSION_MESSAGE: &str = concat!( env!("CARGO_PKG_VERSION"), "-",