From ffe997f7d9d99b379c2f1a4993020e5d8acdd7ed Mon Sep 17 00:00:00 2001 From: DmitryAstafyev Date: Thu, 19 Dec 2024 17:58:00 +0100 Subject: [PATCH] Update types (Dlt stat info) --- application/apps/indexer/Cargo.lock | 4 +- application/apps/indexer/Cargo.toml | 2 +- application/apps/indexer/session/Cargo.toml | 2 +- .../apps/indexer/session/src/unbound/api.rs | 2 +- .../session/src/unbound/commands/dlt.rs | 7 +- .../session/src/unbound/commands/mod.rs | 4 +- application/apps/indexer/stypes/Cargo.toml | 6 +- .../apps/indexer/stypes/bindings/command.ts | 169 +++++++++++------- .../indexer/stypes/bindings/miscellaneous.ts | 102 +++++------ .../stypes/src/command/dltstat/converting.rs | 40 +++++ .../indexer/stypes/src/command/dltstat/mod.rs | 28 +++ .../apps/indexer/stypes/src/command/mod.rs | 2 + .../apps/indexer/stypes/src/command/nodejs.rs | 1 + .../apps/indexer/stypes/src/command/ts.rs | 12 ++ application/apps/protocol/Cargo.lock | 4 +- application/apps/protocol/src/lib.rs | 4 + .../apps/rustcore/rs-bindings/Cargo.lock | 4 +- .../rustcore/rs-bindings/src/js/jobs/mod.rs | 2 +- 18 files changed, 258 insertions(+), 137 deletions(-) create mode 100644 application/apps/indexer/stypes/src/command/dltstat/converting.rs create mode 100644 application/apps/indexer/stypes/src/command/dltstat/mod.rs diff --git a/application/apps/indexer/Cargo.lock b/application/apps/indexer/Cargo.lock index b0222ff96..e350e876f 100644 --- a/application/apps/indexer/Cargo.lock +++ b/application/apps/indexer/Cargo.lock @@ -906,9 +906,9 @@ dependencies = [ [[package]] name = "dlt-core" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52d43b97a134644192c66296e5d3e7ed8b3d409b117c62203047bb42c6b9f1" +checksum = "0b304e32f1164b8c2ef1dc746b32d321f25f88a32672f0f5bcba2df0f70a3b70" dependencies = [ "buf_redux 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder", diff --git a/application/apps/indexer/Cargo.toml b/application/apps/indexer/Cargo.toml index cf4634833..02852d740 100644 --- a/application/apps/indexer/Cargo.toml +++ b/application/apps/indexer/Cargo.toml @@ -24,7 +24,7 @@ thiserror = "2.0" lazy_static = "1.5" tokio = { version = "1", features = ["full"] } tokio-stream = "0.1" -dlt-core = "0.17" +dlt-core = "0.18.0" crossbeam-channel = "0.5" futures = "0.3" tokio-util = "0.7" diff --git a/application/apps/indexer/session/Cargo.toml b/application/apps/indexer/session/Cargo.toml index e494612d4..a589e3990 100644 --- a/application/apps/indexer/session/Cargo.toml +++ b/application/apps/indexer/session/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" blake3 = "1.5" crossbeam-channel.workspace = true dirs.workspace = true -dlt-core = { workspace = true, features = ["statistics"] } +dlt-core = { workspace = true, features = ["statistics", "serde-support"] } envvars = { workspace = true } file-tools = { path = "../addons/file-tools" } futures.workspace = true diff --git a/application/apps/indexer/session/src/unbound/api.rs b/application/apps/indexer/session/src/unbound/api.rs index 69dab9ce3..11c8f94e0 100644 --- a/application/apps/indexer/session/src/unbound/api.rs +++ b/application/apps/indexer/session/src/unbound/api.rs @@ -143,7 +143,7 @@ impl UnboundSessionAPI { &self, id: u64, files: Vec, - ) -> Result, stypes::ComputationError> { + ) -> Result, stypes::ComputationError> { let (tx_results, rx_results) = oneshot::channel(); self.process_command(id, rx_results, Command::GetDltStats(files, tx_results)) .await diff --git a/application/apps/indexer/session/src/unbound/commands/dlt.rs b/application/apps/indexer/session/src/unbound/commands/dlt.rs index 17441f844..75a34d2ff 100644 --- a/application/apps/indexer/session/src/unbound/commands/dlt.rs +++ b/application/apps/indexer/session/src/unbound/commands/dlt.rs @@ -5,7 +5,7 @@ use std::path::Path; pub fn stats( files: Vec, _signal: Signal, -) -> Result, stypes::ComputationError> { +) -> Result, stypes::ComputationError> { let mut stat = StatisticInfo::new(); let mut error: Option = None; files.iter().for_each(|file| { @@ -24,8 +24,5 @@ pub fn stats( if let Some(err) = error { return Err(stypes::ComputationError::IoOperation(err)); } - Ok(stypes::CommandOutcome::Finished( - serde_json::to_string(&stat) - .map_err(|e| stypes::ComputationError::IoOperation(e.to_string()))?, - )) + Ok(stypes::CommandOutcome::Finished(stat.into())) } diff --git a/application/apps/indexer/session/src/unbound/commands/mod.rs b/application/apps/indexer/session/src/unbound/commands/mod.rs index ef4bdcce0..278c33a2a 100644 --- a/application/apps/indexer/session/src/unbound/commands/mod.rs +++ b/application/apps/indexer/session/src/unbound/commands/mod.rs @@ -49,7 +49,9 @@ pub enum Command { ), GetDltStats( Vec, - oneshot::Sender, stypes::ComputationError>>, + oneshot::Sender< + Result, stypes::ComputationError>, + >, ), GetSomeipStatistic( Vec, diff --git a/application/apps/indexer/stypes/Cargo.toml b/application/apps/indexer/stypes/Cargo.toml index 14757a545..85ab8ba41 100644 --- a/application/apps/indexer/stypes/Cargo.toml +++ b/application/apps/indexer/stypes/Cargo.toml @@ -9,7 +9,9 @@ rustcore = [ "tokio", "walkdir", "regex", - "envvars" + "envvars", + "dlt-core/statistics", + "dlt-core/serde-support", ] nodejs = [ "node-bindgen" @@ -17,7 +19,7 @@ nodejs = [ [dependencies] serde = { workspace = true , features = ["derive"] } -dlt-core = { workspace = true } +dlt-core = { workspace = true, features = ["serde-support"] } regex = { workspace = true, optional = true } bincode = "1.3" extend = { path = "../tools/extend"} diff --git a/application/apps/indexer/stypes/bindings/command.ts b/application/apps/indexer/stypes/bindings/command.ts index d9ad7e283..2a03017a7 100644 --- a/application/apps/indexer/stypes/bindings/command.ts +++ b/application/apps/indexer/stypes/bindings/command.ts @@ -5,124 +5,161 @@ * At the core level, this type is used for all commands invoked within an `UnboundSession`. * It is only used to indicate the successful completion or interruption of a command. */ -export type CommandOutcomeBool = { Finished: boolean } | 'Cancelled'; +export type CommandOutcomeBool = { "Finished": boolean } | "Cancelled"; /** * Represents the result of a command execution. * At the core level, this type is used for all commands invoked within an `UnboundSession`. * It is only used to indicate the successful completion or interruption of a command. */ -export type CommandOutcomeFoldersScanningResult = { Finished: FoldersScanningResult } | 'Cancelled'; +export type CommandOutcomeDltStatisticInfoResult = { "Finished": DltStatisticInfo } | "Cancelled"; /** * Represents the result of a command execution. * At the core level, this type is used for all commands invoked within an `UnboundSession`. * It is only used to indicate the successful completion or interruption of a command. */ -export type CommandOutcomeOptionalString = { Finished: string | null } | 'Cancelled'; +export type CommandOutcomeFoldersScanningResult = { "Finished": FoldersScanningResult } | "Cancelled"; /** * Represents the result of a command execution. * At the core level, this type is used for all commands invoked within an `UnboundSession`. * It is only used to indicate the successful completion or interruption of a command. */ -export type CommandOutcomeSerialPortsList = { Finished: SerialPortsList } | 'Cancelled'; +export type CommandOutcomeOptionalString = { "Finished": string | null } | "Cancelled"; /** * Represents the result of a command execution. * At the core level, this type is used for all commands invoked within an `UnboundSession`. * It is only used to indicate the successful completion or interruption of a command. */ -export type CommandOutcomeString = { Finished: string } | 'Cancelled'; +export type CommandOutcomeProfilesResult = { "Finished": ProfileList } | "Cancelled"; /** * Represents the result of a command execution. * At the core level, this type is used for all commands invoked within an `UnboundSession`. * It is only used to indicate the successful completion or interruption of a command. */ -export type CommandOutcomeVoid = 'Finished' | 'Cancelled'; +export type CommandOutcomeSerialPortsList = { "Finished": SerialPortsList } | "Cancelled"; /** * Represents the result of a command execution. * At the core level, this type is used for all commands invoked within an `UnboundSession`. * It is only used to indicate the successful completion or interruption of a command. */ -export type CommandOutcomei64 = { Finished: number } | 'Cancelled'; +export type CommandOutcomeString = { "Finished": string } | "Cancelled"; + +/** + * Represents the result of a command execution. + * At the core level, this type is used for all commands invoked within an `UnboundSession`. + * It is only used to indicate the successful completion or interruption of a command. + */ +export type CommandOutcomeVoid = "Finished" | "Cancelled"; + +/** + * Represents the result of a command execution. + * At the core level, this type is used for all commands invoked within an `UnboundSession`. + * It is only used to indicate the successful completion or interruption of a command. + */ +export type CommandOutcomei64 = { "Finished": number } | "Cancelled"; + +export type DltLevelDistribution = { non_log: number, log_fatal: number, log_error: number, log_warning: number, log_info: number, log_debug: number, log_verbose: number, log_invalid: number, }; + +export type DltStatisticInfo = { app_ids: Array<[string, DltLevelDistribution]>, context_ids: Array<[string, DltLevelDistribution]>, ecu_ids: Array<[string, DltLevelDistribution]>, contained_non_verbose: boolean, }; /** * Represents a folder entity in the file system. */ -export type FolderEntity = { - /** - * The name of the entity (file or folder). - */ - name: string; - /** - * The full path of the entity. - */ - fullname: string; - /** - * The type of the entity (e.g., file, directory, symbolic link). - */ - kind: FolderEntityType; - /** - * Optional detailed information about the entity. - */ - details: FolderEntityDetails | null; -}; +export type FolderEntity = { +/** + * The name of the entity (file or folder). + */ +name: string, +/** + * The full path of the entity. + */ +fullname: string, +/** + * The type of the entity (e.g., file, directory, symbolic link). + */ +kind: FolderEntityType, +/** + * Optional detailed information about the entity. + */ +details: FolderEntityDetails | null, }; /** * Contains detailed information about a folder entity. */ -export type FolderEntityDetails = { - /** - * The name of the file or folder. - */ - filename: string; - /** - * The full path to the file or folder. - */ - full: string; - /** - * The directory path containing the file or folder. - */ - path: string; - /** - * The base name of the file or folder. - */ - basename: string; - /** - * The file extension, if applicable. - */ - ext: string; -}; +export type FolderEntityDetails = { +/** + * The name of the file or folder. + */ +filename: string, +/** + * The full path to the file or folder. + */ +full: string, +/** + * The directory path containing the file or folder. + */ +path: string, +/** + * The base name of the file or folder. + */ +basename: string, +/** + * The file extension, if applicable. + */ +ext: string, }; /** * Represents the type of a folder entity in the file system. */ -export enum FolderEntityType { - BlockDevice = 'BlockDevice', - CharacterDevice = 'CharacterDevice', - Directory = 'Directory', - FIFO = 'FIFO', - File = 'File', - Socket = 'Socket', - SymbolicLink = 'SymbolicLink', -} +export type FolderEntityType = "BlockDevice" | "CharacterDevice" | "Directory" | "FIFO" | "File" | "Socket" | "SymbolicLink"; /** * Represents the result of scanning a folder. */ -export type FoldersScanningResult = { - /** - * A list of folder entities found during the scan. - */ - list: Array; - /** - * Indicates whether the maximum length of results was reached. - */ - max_len_reached: boolean; -}; +export type FoldersScanningResult = { +/** + * A list of folder entities found during the scan. + */ +list: Array, +/** + * Indicates whether the maximum length of results was reached. + */ +max_len_reached: boolean, }; + +export type Profile = { +/** + * Suggested name of shell. For unix based systems it will be name of executable file, + * like "bash", "fish" etc. For windows it will be names like "GitBash", "PowerShell" + * etc. + */ +name: string, +/** + * Path to executable file of shell + */ +path: string, +/** + * List of environment variables. Because extracting operation could take some time + * by default `envvars = None`. To load data should be used method `load`, which will + * make attempt to detect environment variables. + */ +envvars: Map, +/** + * true - if path to executable file of shell is symlink to another location. + */ +symlink: boolean, }; + +/** + * Represents a list of serial ports. + * + * This structure contains a vector of strings, where each string represents the name + * or identifier of a serial port available on the system. + */ +export type ProfileList = Array; /** * Represents a list of serial ports. diff --git a/application/apps/indexer/stypes/bindings/miscellaneous.ts b/application/apps/indexer/stypes/bindings/miscellaneous.ts index 8b2df171f..59ab592e7 100644 --- a/application/apps/indexer/stypes/bindings/miscellaneous.ts +++ b/application/apps/indexer/stypes/bindings/miscellaneous.ts @@ -9,17 +9,16 @@ export type AroundIndexes = [number | undefined | null, number | undefined | nul /** * Describes a match for a search condition. */ -export type FilterMatch = { - /** - * The index (number) of the matching log entry. - */ - index: number; - /** - * The identifiers of the filters (search conditions) that matched - * the specified log entry. - */ - filters: Array; -}; +export type FilterMatch = { +/** + * The index (number) of the matching log entry. + */ +index: number, +/** + * The identifiers of the filters (search conditions) that matched + * the specified log entry. + */ +filters: Array, }; /** * A list of matches for a search condition. @@ -29,42 +28,41 @@ export type FilterMatchList = Array; /** * Information about a log entry. */ -export type GrabbedElement = { - /** - * The unique identifier of the source. - */ - source_id: number; - /** - * The textual content of the log entry. - */ - content: string; - /** - * The position of the log entry in the overall stream. - */ - pos: number; - /** - * The nature of the log entry, represented as a bitmask. Possible values include: - * - `SEARCH`: Nature = Nature(1) - * - `BOOKMARK`: Nature = Nature(1 << 1) - * - `EXPANDED`: Nature = Nature(1 << 5) - * - `BREADCRUMB`: Nature = Nature(1 << 6) - * - `BREADCRUMB_SEPARATOR`: Nature = Nature(1 << 7) - */ - nature: number; -}; +export type GrabbedElement = { +/** + * The unique identifier of the source. + */ +source_id: number, +/** + * The textual content of the log entry. + */ +content: string, +/** + * The position of the log entry in the overall stream. + */ +pos: number, +/** + * The nature of the log entry, represented as a bitmask. Possible values include: + * - `SEARCH`: Nature = Nature(1) + * - `BOOKMARK`: Nature = Nature(1 << 1) + * - `EXPANDED`: Nature = Nature(1 << 5) + * - `BREADCRUMB`: Nature = Nature(1 << 6) + * - `BREADCRUMB_SEPARATOR`: Nature = Nature(1 << 7) + */ +nature: number, }; /** * A list of log entries. */ export type GrabbedElementList = Array; -export type MapKeyValue = Map; +export type MapKeyValue = { [key in string]?: string }; /** * Representation of ranges. We cannot use std ranges as soon as no way * to derive Serialize, Deserialize */ -export type Range = { start: number; end: number }; +export type Range = { start: number, end: number, }; /** * A list of ranges to read. @@ -75,33 +73,31 @@ export type Ranges = Array; * A request to a stream that supports feedback, such as a terminal command * that accepts input through `stdin`. */ -export type SdeRequest = { WriteText: string } | { WriteBytes: Array }; +export type SdeRequest = { "WriteText": string } | { "WriteBytes": Array }; /** * The response from a source to a sent `SdeRequest`. Note that sending data * with `SdeRequest` does not guarantee a response, as the behavior depends * on the source. */ -export type SdeResponse = { - /** - * The number of bytes received. - */ - bytes: number; -}; +export type SdeResponse = { +/** + * The number of bytes received. + */ +bytes: number, }; /** * Describes a data source. */ -export type SourceDefinition = { - /** - * The unique identifier of the source. - */ - id: number; - /** - * The user-friendly name of the source for display purposes. - */ - alias: string; -}; +export type SourceDefinition = { +/** + * The unique identifier of the source. + */ +id: number, +/** + * The user-friendly name of the source for display purposes. + */ +alias: string, }; /** * A list of data sources. diff --git a/application/apps/indexer/stypes/src/command/dltstat/converting.rs b/application/apps/indexer/stypes/src/command/dltstat/converting.rs new file mode 100644 index 000000000..0e141e560 --- /dev/null +++ b/application/apps/indexer/stypes/src/command/dltstat/converting.rs @@ -0,0 +1,40 @@ +use crate::*; +use dlt_core::statistics; + +impl From for DltLevelDistribution { + fn from(v: statistics::LevelDistribution) -> Self { + DltLevelDistribution { + non_log: v.non_log, + log_fatal: v.log_fatal, + log_error: v.log_error, + log_warning: v.log_warning, + log_info: v.log_info, + log_debug: v.log_debug, + log_verbose: v.log_verbose, + log_invalid: v.log_invalid, + } + } +} + +trait InnerInto { + fn inner_into(self) -> T; +} + +impl InnerInto> + for Vec<(String, statistics::LevelDistribution)> +{ + fn inner_into(self) -> Vec<(String, DltLevelDistribution)> { + self.into_iter().map(|(k, l)| (k, l.into())).collect() + } +} + +impl From for DltStatisticInfo { + fn from(v: statistics::StatisticInfo) -> Self { + DltStatisticInfo { + app_ids: v.app_ids.inner_into(), + context_ids: v.context_ids.inner_into(), + ecu_ids: v.ecu_ids.inner_into(), + contained_non_verbose: v.contained_non_verbose, + } + } +} diff --git a/application/apps/indexer/stypes/src/command/dltstat/mod.rs b/application/apps/indexer/stypes/src/command/dltstat/mod.rs new file mode 100644 index 000000000..828392d1a --- /dev/null +++ b/application/apps/indexer/stypes/src/command/dltstat/mod.rs @@ -0,0 +1,28 @@ +#[cfg(feature = "rustcore")] +mod converting; + +use crate::*; + +#[derive(Clone, Serialize, Deserialize, Debug)] +#[extend::encode_decode] +#[cfg_attr(test, derive(TS), ts(export, export_to = "command.ts"))] +pub struct DltLevelDistribution { + pub non_log: usize, + pub log_fatal: usize, + pub log_error: usize, + pub log_warning: usize, + pub log_info: usize, + pub log_debug: usize, + pub log_verbose: usize, + pub log_invalid: usize, +} + +#[derive(Clone, Serialize, Deserialize, Debug)] +#[extend::encode_decode] +#[cfg_attr(test, derive(TS), ts(export, export_to = "command.ts"))] +pub struct DltStatisticInfo { + pub app_ids: Vec<(String, DltLevelDistribution)>, + pub context_ids: Vec<(String, DltLevelDistribution)>, + pub ecu_ids: Vec<(String, DltLevelDistribution)>, + pub contained_non_verbose: bool, +} diff --git a/application/apps/indexer/stypes/src/command/mod.rs b/application/apps/indexer/stypes/src/command/mod.rs index 54a79ab14..8ebea6102 100644 --- a/application/apps/indexer/stypes/src/command/mod.rs +++ b/application/apps/indexer/stypes/src/command/mod.rs @@ -7,10 +7,12 @@ mod proptest; #[cfg(test)] mod ts; +mod dltstat; mod folders; mod profiles; mod serial; +pub use dltstat::*; pub use folders::*; pub use profiles::*; pub use serial::*; diff --git a/application/apps/indexer/stypes/src/command/nodejs.rs b/application/apps/indexer/stypes/src/command/nodejs.rs index 108181841..e223444e8 100644 --- a/application/apps/indexer/stypes/src/command/nodejs.rs +++ b/application/apps/indexer/stypes/src/command/nodejs.rs @@ -4,6 +4,7 @@ try_into_js!(CommandOutcome); try_into_js!(CommandOutcome); try_into_js!(CommandOutcome); try_into_js!(CommandOutcome); +try_into_js!(CommandOutcome); try_into_js!(CommandOutcome<()>); try_into_js!(CommandOutcome); try_into_js!(CommandOutcome>); diff --git a/application/apps/indexer/stypes/src/command/ts.rs b/application/apps/indexer/stypes/src/command/ts.rs index fbcf3a22b..7e284ac61 100644 --- a/application/apps/indexer/stypes/src/command/ts.rs +++ b/application/apps/indexer/stypes/src/command/ts.rs @@ -1,5 +1,17 @@ use crate::*; +/// Represents the result of a command execution. +/// At the core level, this type is used for all commands invoked within an `UnboundSession`. +/// It is only used to indicate the successful completion or interruption of a command. +#[derive(Clone, Serialize, Deserialize, Debug)] +#[cfg_attr(test, derive(TS), ts(export, export_to = "command.ts"))] +pub enum CommandOutcomeDltStatisticInfoResult { + /// Indicates that the command was successfully completed. + Finished(DltStatisticInfo), + /// Indicates that the command execution was interrupted. + Cancelled, +} + /// Represents the result of a command execution. /// At the core level, this type is used for all commands invoked within an `UnboundSession`. /// It is only used to indicate the successful completion or interruption of a command. diff --git a/application/apps/protocol/Cargo.lock b/application/apps/protocol/Cargo.lock index 334f0b997..2850dfd0b 100644 --- a/application/apps/protocol/Cargo.lock +++ b/application/apps/protocol/Cargo.lock @@ -75,9 +75,9 @@ dependencies = [ [[package]] name = "dlt-core" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52d43b97a134644192c66296e5d3e7ed8b3d409b117c62203047bb42c6b9f1" +checksum = "0b304e32f1164b8c2ef1dc746b32d321f25f88a32672f0f5bcba2df0f70a3b70" dependencies = [ "byteorder", "bytes", diff --git a/application/apps/protocol/src/lib.rs b/application/apps/protocol/src/lib.rs index 5078ddeb1..225582e44 100644 --- a/application/apps/protocol/src/lib.rs +++ b/application/apps/protocol/src/lib.rs @@ -101,9 +101,13 @@ gen_encode_decode_fns!(UDPTransportConfig); gen_encode_decode_fns!(FileFormat); gen_encode_decode_fns!(ObserveOrigin); gen_encode_decode_fns!(FoldersScanningResult); +gen_encode_decode_fns!(DltStatisticInfo); +gen_encode_decode_fns!(Profile); +gen_encode_decode_fns!(ProfileList); gen_encode_decode_fns!(CommandOutcome); gen_encode_decode_fns!(CommandOutcome); gen_encode_decode_fns!(CommandOutcome); +gen_encode_decode_fns!(CommandOutcome); gen_encode_decode_fns!(CommandOutcome); gen_encode_decode_fns!(CommandOutcome<()>); gen_encode_decode_fns!(CommandOutcome); diff --git a/application/apps/rustcore/rs-bindings/Cargo.lock b/application/apps/rustcore/rs-bindings/Cargo.lock index 016f0f6f1..96297c41e 100644 --- a/application/apps/rustcore/rs-bindings/Cargo.lock +++ b/application/apps/rustcore/rs-bindings/Cargo.lock @@ -646,9 +646,9 @@ dependencies = [ [[package]] name = "dlt-core" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52d43b97a134644192c66296e5d3e7ed8b3d409b117c62203047bb42c6b9f1" +checksum = "0b304e32f1164b8c2ef1dc746b32d321f25f88a32672f0f5bcba2df0f70a3b70" dependencies = [ "buf_redux 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder", diff --git a/application/apps/rustcore/rs-bindings/src/js/jobs/mod.rs b/application/apps/rustcore/rs-bindings/src/js/jobs/mod.rs index da508aa86..5db31b87a 100644 --- a/application/apps/rustcore/rs-bindings/src/js/jobs/mod.rs +++ b/application/apps/rustcore/rs-bindings/src/js/jobs/mod.rs @@ -150,7 +150,7 @@ impl UnboundJobs { &self, id: i64, files: Vec, - ) -> Result, stypes::ComputationError> { + ) -> Result, stypes::ComputationError> { self.api .as_ref() .ok_or(stypes::ComputationError::SessionUnavailable)?