Skip to content

Commit

Permalink
introduce re_types
Browse files Browse the repository at this point in the history
  • Loading branch information
teh-cmc committed Jun 11, 2023
1 parent 6b3d2ac commit 19ee454
Show file tree
Hide file tree
Showing 16 changed files with 375 additions and 0 deletions.
16 changes: 16 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ re_tensor_ops = { path = "crates/re_tensor_ops", version = "0.7.0-alpha.0", defa
re_time_panel = { path = "crates/re_time_panel", version = "=0.7.0-alpha.0", default-features = false }
re_tracing = { path = "crates/re_tracing", version = "0.7.0-alpha.0", default-features = false }
re_tuid = { path = "crates/re_tuid", version = "0.7.0-alpha.0", default-features = false }
re_types = { path = "crates/re_types", version = "=0.7.0-alpha.0", default-features = false }
re_types_builder = { path = "crates/re_types_builder", version = "=0.7.0-alpha.0", default-features = false }
re_ui = { path = "crates/re_ui", version = "0.7.0-alpha.0", default-features = false }
re_viewer = { path = "crates/re_viewer", version = "0.7.0-alpha.0", default-features = false }
Expand Down
61 changes: 61 additions & 0 deletions crates/re_types/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
[package]
name = "re_types"
authors.workspace = true
description = "The standard Rerun data types, component types, and archetypes."
edition.workspace = true
homepage.workspace = true
include.workspace = true
license.workspace = true
publish = true
readme = "README.md"
repository.workspace = true
rust-version.workspace = true
version.workspace = true


[package.metadata.docs.rs]
all-features = true


[features]
default = []

## Enable color conversions.
ecolor = ["dep:ecolor"]

## Add support for some math operations using [`glam`](https://crates.io/crates/glam/).
glam = ["dep:glam", "dep:macaw"]


[dependencies]

# External
arrow2 = { workspace = true, features = [
"io_ipc",
"io_print",
"compute_concatenate",
] }
bytemuck = { version = "1.11", features = ["derive", "extern_crate_alloc"] }
document-features = "0.2"

# External (optional)
ecolor = { workspace = true, optional = true }
glam = { workspace = true, optional = true }
macaw = { workspace = true, optional = true }


[dev-dependencies]

# External
glam.workspace = true
itertools.workspace = true


[build-dependencies]

# Rerun
re_build_tools.workspace = true
re_types_builder.workspace = true

# External
xshell = "0.2"
12 changes: 12 additions & 0 deletions crates/re_types/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# re_types

Part of the [`rerun`](https://github.com/rerun-io/rerun) family of crates.

[![Latest version](https://img.shields.io/crates/v/re_types.svg)](https://crates.io/crates/re_types)
[![Documentation](https://docs.rs/re_types/badge.svg)](https://docs.rs/re_types)
![MIT](https://img.shields.io/badge/license-MIT-blue.svg)
![Apache](https://img.shields.io/badge/license-Apache-blue.svg)

The standard Rerun data types, component types, and archetypes.

This crate includes both the language-agnostic definitions (flatbuffers IDL) as well as the generated code.
104 changes: 104 additions & 0 deletions crates/re_types/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
//! Generates Rust & Python code from flatbuffers definitions.
use xshell::{cmd, Shell};

use re_build_tools::{
compute_crate_hash, compute_dir_hash, compute_strings_hash, is_tracked_env_var_set, iter_dir,
read_versioning_hash, rerun_if_changed, rerun_if_changed_or_doesnt_exist,
write_versioning_hash,
};

// NOTE: Don't need to add extra context to xshell invocations, it does so on its own.

// ---

const SOURCE_HASH_PATH: &str = "./source_hash.txt";
const DEFINITIONS_DIR_PATH: &str = "./definitions";
const RUST_OUTPUT_DIR_PATH: &str = ".";
const PYTHON_OUTPUT_DIR_PATH: &str = "../../rerun_py/rerun2";

fn main() {
if std::env::var("CI").is_ok() {
// Don't run on CI!
//
// The code we're generating here is actual source code that gets committed into the
// repository.
return;
}

if !is_tracked_env_var_set("IS_IN_RERUN_WORKSPACE") {
// Only run if we are in the rerun workspace, not on users machines.
return;
}
if is_tracked_env_var_set("RERUN_IS_PUBLISHING") {
// We don't need to rebuild - we should have done so beforehand!
// See `RELEASES.md`
return;
}

rerun_if_changed_or_doesnt_exist(SOURCE_HASH_PATH);
for path in iter_dir(DEFINITIONS_DIR_PATH, Some(&[".fbs"])) {
rerun_if_changed(&path);
}

// NOTE: We need to hash both the flatbuffers definitions as well as the source code of the
// code generator itself!
let re_types_builder_hash = compute_crate_hash("re_types_builder");
let cur_hash = read_versioning_hash(SOURCE_HASH_PATH);
let new_hash = compute_dir_hash(DEFINITIONS_DIR_PATH, Some(&[".fbs"]));
let new_hash_final = compute_strings_hash(&[&re_types_builder_hash, &new_hash]);

// Leave these be please, very useful when debugging.
eprintln!("re_types_builder_hash: {re_types_builder_hash:?}");
eprintln!("cur_hash: {cur_hash:?}");
eprintln!("new_hash: {new_hash:?}");
eprintln!("new_hash_final: {new_hash_final:?}");

if let Some(cur_hash) = cur_hash {
if cur_hash == new_hash_final {
// Neither the source of the code generator nor the IDL definitions have changed, no need
// to do anything at this point.
return;
}
}

let sh = Shell::new().unwrap();

re_types_builder::generate_rust_code(
DEFINITIONS_DIR_PATH,
RUST_OUTPUT_DIR_PATH,
"./definitions/rerun/archetypes.fbs",
);

// NOTE: We're purposefully ignoring the error here.
//
// In the very unlikely chance that the user doesn't have `cargo` in their $PATH, there's
// still no good reason to fail the build.
//
// The CI will catch the unformatted files at PR time and complain appropriately anyhow.
cmd!(sh, "cargo fmt").run().ok();

re_types_builder::generate_python_code(
DEFINITIONS_DIR_PATH,
PYTHON_OUTPUT_DIR_PATH,
"./definitions/rerun/archetypes.fbs",
);

// NOTE: We're purposefully ignoring the error here.
//
// If the user doesn't have `black` in their $PATH, there's still no good reason to fail
// the build.
//
// The CI will catch the unformatted files at PR time and complain appropriately anyhow.
cmd!(sh, "black {PYTHON_OUTPUT_DIR_PATH}").run().ok();

// NOTE: We're purposefully ignoring the error here.
//
// If the user doesn't have `ruff` in their $PATH, there's still no good reason to fail
// the build.
//
// The CI will catch the unformatted files at PR time and complain appropriately anyhow.
cmd!(sh, "ruff --fix {PYTHON_OUTPUT_DIR_PATH}").run().ok();

write_versioning_hash(SOURCE_HASH_PATH, new_hash_final);
}
12 changes: 12 additions & 0 deletions crates/re_types/definitions/arrow/attributes.fbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace arrow;

/// Marks a union as sparse from Arrow's standpoint, affecting its Arrow datatype.
///
/// Only applies to unions.
attribute "arrow.attr.sparse_union";

/// Marks a single-field object as transparent from Arrow's standpoint, affecting its Arrow
/// datatype.
///
/// This is generally most useful for getting rid of extraneous `struct` layers.
attribute "arrow.attr.transparent";
16 changes: 16 additions & 0 deletions crates/re_types/definitions/fbs/attributes.fbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace fbs.attributes;

/// Mandatory attribute that applies to all kinds of objects: structs, enums, unions and even the
/// fields within.
///
/// This defines a stable order between objects of the same kind, e.g. the order in which fields of a
/// struct should be laid out when generating code.
/// This is always required since flatbuffers works entirely with unordered maps internally, which
/// would results in flaky code generation.
///
/// In unions, this effectively defines the arrow type of each variant, since that depends on the
/// fields's order!
///
/// NOTE: We do not use flatbuffers' builtin `id` attribute as it only works on `table`s, whereas we
/// need a stable order for all kinds of things.
attribute "order";
10 changes: 10 additions & 0 deletions crates/re_types/definitions/fbs/scalars.fbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/// Unions cannot directly refer to scalar types, they need to be wrapped in a struct or table
/// first.
/// This package provides pre-wrapped scalars that will be automatically flattened down to their
/// inner type by our parsers.
namespace fbs.scalars;

/// Flattens down to a 32-bit float.
struct Float32 {
v: float;
}
16 changes: 16 additions & 0 deletions crates/re_types/definitions/python/attributes.fbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace python.attributes;

/// Marks a field as transparent, meaning its type will be replaced by the underlying type.
///
/// Only applies to field whose types have a single-field.
attribute "python.attr.transparent";

/// Defines the type aliases for a component, e.g. the types that make up `ComponentLike`.
///
/// Only applies to structs/unions that are components.
attribute "python.attr.aliases";

/// Defines the array type aliases for a component, e.g. the types that make up `ComponentArrayLike`.
///
/// Only applies to structs/unions that are components.
attribute "python.attr.array_aliases";
1 change: 1 addition & 0 deletions crates/re_types/definitions/rerun/archetypes.fbs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
namespace rerun.archetypes;
15 changes: 15 additions & 0 deletions crates/re_types/definitions/rust/attributes.fbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace rust.attributes;

/// Apply to a struct or table object to generate a tuple struct.
///
/// The type definition of the target object must have exactly a single field.
attribute "rust.attr.tuple_struct";

/// Apply to any object to generate a #derive clause.
///
/// The value of the attribute will be trimmed out but otherwise left as-is.
/// E.g. "rust.attr.derive": "Debug, Clone, Copy"`.
attribute "rust.attr.derive";

/// Apply to any object to generate a #repr clause with the specified value.
attribute "rust.attr.repr";
4 changes: 4 additions & 0 deletions crates/re_types/source_hash.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# This is a sha256 hash for all direct and indirect dependencies of this crate's build script.
# It can be safely removed at anytime to force the build script to run again.
# Check out build.rs to see how it's computed.
e4b94e84d8869a38e732e777b6ab8e7d4ae7780e04cc3c89512e444cdda5ee50
1 change: 1 addition & 0 deletions crates/re_types/src/archetypes/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// NOTE: This file was autogenerated by re_types_builder; DO NOT EDIT.
1 change: 1 addition & 0 deletions crates/re_types/src/components/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// NOTE: This file was autogenerated by re_types_builder; DO NOT EDIT.
1 change: 1 addition & 0 deletions crates/re_types/src/datatypes/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// NOTE: This file was autogenerated by re_types_builder; DO NOT EDIT.
Loading

0 comments on commit 19ee454

Please sign in to comment.