#![doc(
html_favicon_url = "https://observation.tools/img/favicon.svg",
html_logo_url = "https://observation.tools/img/logo.svg",
issue_tracker_base_url = "https://github.com/Dig-Doug/observation-tools-client/issues/"
)]
//!
//! # Quickstart
//!
//! Observation Tools helps you quickly inspect complex data without needing to
//! build your own visualization tools.
//!
//! Integrating Observation Tools into your program takes about 5 minutes. You
//! need to:
//!
//! 1. Create a project
//! 2. Install a client library
//! 3. Export your data
//! 5. Visualize your data
//!
//! ### Organizing your data
//!
//! We use four different concepts to organize your data:
//!
//! - **Artifacts** are individual pieces of data, e.g. an image
//! - **Artifact groups** help organize artifacts and can define how artifacts
//! can be visualized together.
//! - **Runs** are the top level artifact groups. The normally correspond to one
//! program execution or http request.
//! - **Projects** allow you to define common settings used across runs.
//!
//! ## Create a project
//!
//! All data uploaded to Observation Tools is associated with a project.
//! Projects have a unique ID that you'll use to initialize the client in the
//! next step.
//!
//! To create a project, do the following:
//! 1. Sign in to the [dashboard](https://app.observation.tools/)
//! 1. Click "Create project"
//!
//! You should see your project's ID on the following screen. You can also find
//! it on the "Settings" page. Project IDs are not sensitive, so you can embed
//! them in your source code.
//!
//! ## Install a client library
//!
//! We have client libraries for a few different languages:
//!
//! | Language | Package | Version|
//! |----------|---------| -------|
//! | Rust | `observation-tools` | [![Crates.io](https://img.shields.io/crates/v/observation-tools)](https://crates.io/crates/observation-tools) |
//! | JavaScript **experimental** | `@observation-tools/client` | [![npm(scoped)](https://img.shields.io/npm/v/%40observation-tools/client)](https://www.npmjs.com/package/@observation-tools/client) |
//!
//! Don't see the language you're looking for? Let us know! File a [feature request](https://github.com/Dig-Doug/observation-tools-client/issues) or [email us](mailto:help@observation.tools).
//!
//! Install the Rust client with the following command:
//!
//! ```sh
//! cargo add observation-tools
//! ```
//!
//! ## Export your data
//!
//! To start exporting data from your program, we need to set up a client for
//! your project and create a run. After that, we can create groups to organize
//! artifacts during different parts of our program and export artifacts:
//!
//! ```rust
//! # fn main() -> Result<(), Box> {
//! use observation_tools_client::artifacts::Point2Builder;
//! use observation_tools_client::artifacts::Segment2Builder;
//! use observation_tools_client::Client;
//! use observation_tools_client::ClientOptions;
//! use observation_tools_client::TokenGenerator;
//!
//! let client = Client::new(
//! std::env::var("OBSERVATION_TOOLS_PROJECT_ID")?,
//! ClientOptions::default(),
//! )?;
//!
//! /// The name of the run will show up in the UI. You can optionally add key-value metadata to
//! /// all objects, see [`builders::UserMetadataBuilder::add_metadata`].
//! let run_uploader = client.create_run("getting-started-example")?;
//! /// ArtifactGroups are represented as "uploaders"
//! let uploader_2d = run_uploader.child_uploader_2d("shapes")?;
//! uploader_2d.create_object2(
//! "segment2",
//! Segment2Builder::new(Point2Builder::new(-1.0, 1.0), Point2Builder::new(1.0, -1.0)),
//! )?;
//!
//! println!("See the output at: {}", run_uploader.viewer_url());
//! # Ok(())
//! # }
//! ```
//!
//! For more information on the types of data you can upload, see the
//! documentation for the [`artifacts`] module.
//!
//! ## Visualize your data
//!
//! To view the exported data, you can either find the run on the [dashboard](https://app.observation.tools/) or generate a direct url with [`groups::RunUploader::viewer_url`].
//!
//! # Examples
//! For more examples, check out the [examples](https://github.com/Dig-Doug/observation-tools-client/tree/main/examples) directory in the repository.
extern crate alloc;
extern crate core;
pub mod artifacts;
mod client;
mod generated;
pub mod groups;
mod run_id;
mod task_handle;
mod task_loop;
mod token_generator;
mod util;
// TODO: https://github.com/rust-lang/rust/issues/67295
pub mod test_utils;
pub use crate::client::Client;
pub use crate::client::ClientOptions;
use crate::generated::ArtifactId;
pub use crate::task_handle::ArtifactUploadHandle;
pub use crate::task_handle::ArtifactUploader2dTaskHandle;
pub use crate::task_handle::ArtifactUploader3dTaskHandle;
pub(crate) use crate::task_handle::BaseArtifactUploaderTaskHandle;
pub use crate::task_handle::GenericArtifactUploaderTaskHandle;
pub use crate::task_handle::PublicArtifactIdTaskHandle;
pub use crate::task_handle::PublicSeriesIdTaskHandle;
pub use crate::task_handle::RunUploaderTaskHandle;
pub use crate::token_generator::TokenGenerator;
pub use crate::util::ClientError;
use tracing_wasm::WASMLayerConfigBuilder;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
#[derive(Debug, Clone)]
pub struct PublicArtifactId {
pub(crate) id: ArtifactId,
}
#[wasm_bindgen(start)]
pub fn start() -> Result<(), JsValue> {
// print pretty errors in wasm https://github.com/rustwasm/console_error_panic_hook
// This is not needed for tracing_wasm to work, but it is a common tool for
// getting proper error line numbers for panics.
console_error_panic_hook::set_once();
let mut config_builder = WASMLayerConfigBuilder::new();
#[cfg(not(debug_assertions))]
config_builder.set_max_level(tracing::Level::WARN);
tracing_wasm::set_as_global_default_with_config(config_builder.build());
Ok(())
}