#![doc = document_features::document_features!()]
#![allow(clippy::unwrap_used)]
#![warn(missing_docs)] mod binary_stream_sink;
mod global;
mod log_sink;
mod recording_stream;
mod spawn;
pub use spawn::{spawn, SpawnError, SpawnOptions};
pub use self::recording_stream::{
forced_sink_path, RecordingStream, RecordingStreamBuilder, RecordingStreamError,
RecordingStreamResult,
};
pub use re_sdk_comms::{default_flush_timeout, default_server_addr};
pub use re_log_types::{
entity_path, ApplicationId, EntityPath, EntityPathPart, Instance, StoreId, StoreKind,
};
pub use re_memory::MemoryLimit;
pub use global::cleanup_if_forked_child;
#[cfg(not(target_arch = "wasm32"))]
impl crate::sink::LogSink for re_log_encoding::FileSink {
fn send(&self, msg: re_log_types::LogMsg) {
Self::send(self, msg);
}
#[inline]
fn flush_blocking(&self) {
Self::flush_blocking(self);
}
}
pub mod sink {
pub use crate::binary_stream_sink::{
BinaryStreamSink, BinaryStreamSinkError, BinaryStreamStorage,
};
pub use crate::log_sink::{
BufferedSink, CallbackSink, LogSink, MemorySink, MemorySinkStorage, TcpSink,
};
#[cfg(not(target_arch = "wasm32"))]
pub use re_log_encoding::{FileSink, FileSinkError};
}
pub mod log {
pub use re_chunk::{
Chunk, ChunkBatcher, ChunkBatcherConfig, ChunkBatcherError, ChunkBatcherResult, ChunkError,
ChunkId, ChunkResult, PendingRow, RowId, TimeColumn, TransportChunk,
};
pub use re_log_types::LogMsg;
}
pub mod time {
pub use re_log_types::{Time, TimeInt, TimePoint, TimeType, Timeline};
}
pub use time::{Time, TimePoint, Timeline};
pub use re_types_core::{
Archetype, ArchetypeName, AsComponents, Component, ComponentBatch, ComponentName, DatatypeName,
GenericIndicatorComponent, Loggable, LoggableBatch, MaybeOwnedComponentBatch,
NamedIndicatorComponent, SizeBytes,
};
#[cfg(feature = "data_loaders")]
pub use re_data_loader::{DataLoader, DataLoaderError, DataLoaderSettings, LoadedData};
#[cfg(feature = "web_viewer")]
pub mod web_viewer;
pub mod external {
pub use re_log;
pub use re_log_encoding;
pub use re_log_types;
pub use re_sdk_comms;
pub use re_log::external::*;
pub use re_log_types::external::*;
#[cfg(feature = "data_loaders")]
pub use re_data_loader;
}
pub fn build_info() -> re_build_info::BuildInfo {
re_build_info::build_info!()
}
const RERUN_ENV_VAR: &str = "RERUN";
fn get_rerun_env() -> Option<bool> {
std::env::var(RERUN_ENV_VAR)
.ok()
.and_then(|s| match s.to_lowercase().as_str() {
"0" | "false" | "off" => Some(false),
"1" | "true" | "on" => Some(true),
_ => {
re_log::warn!(
"Invalid value for environment variable {RERUN_ENV_VAR}={s:?}. Expected 'on' or 'off'. It will be ignored"
);
None
}
})
}
pub fn decide_logging_enabled(default_enabled: bool) -> bool {
match get_rerun_env() {
Some(true) => {
re_log::info_once!(
"Rerun Logging is enabled by the '{RERUN_ENV_VAR}' environment variable."
);
true
}
Some(false) => {
re_log::info_once!(
"Rerun Logging is disabled by the '{RERUN_ENV_VAR}' environment variable."
);
false
}
None => {
if !default_enabled {
re_log::info_once!(
"Rerun Logging has been disabled. Turn it on with the '{RERUN_ENV_VAR}' environment variable."
);
}
default_enabled
}
}
}
#[track_caller] pub fn new_store_info(
application_id: impl Into<re_log_types::ApplicationId>,
) -> re_log_types::StoreInfo {
re_log_types::StoreInfo {
application_id: application_id.into(),
store_id: StoreId::random(StoreKind::Recording),
cloned_from: None,
is_official_example: called_from_official_rust_example(),
started: re_log_types::Time::now(),
store_source: re_log_types::StoreSource::RustSdk {
rustc_version: env!("RE_BUILD_RUSTC_VERSION").into(),
llvm_version: env!("RE_BUILD_LLVM_VERSION").into(),
},
store_version: Some(re_build_info::CrateVersion::LOCAL),
}
}
#[track_caller]
fn called_from_official_rust_example() -> bool {
const SENTINEL_FILENAME: &str = ".rerun_examples";
let caller = core::panic::Location::caller();
let mut path = std::path::PathBuf::from(caller.file());
let mut is_official_example = false;
for _ in 0..4 {
path.pop(); if path.join(SENTINEL_FILENAME).exists() {
is_official_example = true;
}
}
is_official_example
}