mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-10 15:53:01 +00:00
A new standalone crate, vectorcraft-apischema, describes a command's parameters: type (number with range and unit, integer, boolean, string, enum, id, id list, color, point, object, array), whether each is required, the default of an omitted value, whether null counts as omitted, the API levels it was added and deprecated at, and the lenient, cost and writes fields. It validates a params object and names the parameter of the first problem, writes the params text, writes the schema in the shape of a JSON Schema 2020-12 object schema, and hashes a set of schemas. CommandSpec gains an optional schema (both builders: the cmd! macro and the text style specs). Session::execute checks the params of a command that has one before anything else, refusing a value of the wrong type, out of range or not in its list, a missing parameter or an unknown key with an error naming the parameter, and fills in defaults; the journal keeps the params as given. engine.commands lists each schema. The six commands in cmd/views.rs have schemas, and their params text is the text the schema writes. schemas::API_VERSION is 1, and a test fails when a schema changes without a new row in SCHEMA_HASHES. Docs: docs/mcp.md (Parameter schemas), docs/target-app-parity.md.
172 lines
9.8 KiB
TOML
172 lines
9.8 KiB
TOML
[workspace]
|
||
resolver = "3"
|
||
members = ["crates/*", "apps/*", "xtask"]
|
||
default-members = ["crates/*", "apps/vectorcraft", "apps/vectorcraft-cli", "xtask"]
|
||
|
||
[workspace.package]
|
||
version = "0.21.0"
|
||
edition = "2024"
|
||
license = "MIT OR Apache-2.0"
|
||
rust-version = "1.95"
|
||
repository = "https://github.com/storytold/vectorcraft"
|
||
|
||
[workspace.dependencies]
|
||
craft-pdf = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb", default-features = false, features = ["interpret", "write"] }
|
||
craft-print = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
craft-docpath = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
craft-ui = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb", features = ["serde"] }
|
||
craft-keymap = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
# Decides who draws the window frame (desktop vs. app) so the suite shares one native titlebar per
|
||
# desktop. The `egui` feature adds `craft_window::decorate`. (craft-libs#217.)
|
||
craft-window = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb", features = ["egui"] }
|
||
# The `.vectorcraft` envelope: its members, version, embedded images and the data after the JSON.
|
||
craft-vectorcraft-format = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
# craft-update: app-specific pretend versions apply to startup and manual checks.
|
||
craft-update = { git = "https://github.com/storytold/craft-libs", version = "=0.1.0", rev = "c5a1cbfb5f9049f9270955caffb5bee5997aebf7", features = ["egui"] }
|
||
# internal
|
||
vectorcraft-geom = { path = "crates/geom" }
|
||
vectorcraft-color = { path = "crates/color" }
|
||
vectorcraft-doc = { path = "crates/doc" }
|
||
vectorcraft-pathops = { path = "crates/pathops" }
|
||
vectorcraft-brush = { path = "crates/brush" }
|
||
vectorcraft-trace = { path = "crates/trace" }
|
||
# Without its default `bundled-fonts`: a crate that wants the fonts asks for them (the apps and
|
||
# vectorcraft-testkit through the engine's `bundled-fonts`), so a library crate never forces them on
|
||
# an embedder that supplies its fonts at run time.
|
||
vectorcraft-text = { path = "crates/text", default-features = false }
|
||
vectorcraft-effects = { path = "crates/effects" }
|
||
vectorcraft-three-d = { path = "crates/three-d" }
|
||
vectorcraft-render = { path = "crates/render" }
|
||
vectorcraft-svg = { path = "crates/svg" }
|
||
vectorcraft-pdf = { path = "crates/pdf" }
|
||
vectorcraft-format = { path = "crates/format" }
|
||
vectorcraft-tools = { path = "crates/tools" }
|
||
# Without its default `bundled-fonts`, as vectorcraft-text: each crate that wants the fonts asks for
|
||
# them, so an embedder can build without them (docs/development.md › Leaving out the bundled fonts).
|
||
vectorcraft-engine = { path = "crates/engine", default-features = false }
|
||
vectorcraft-ui-egui = { path = "crates/ui-egui" }
|
||
vectorcraft-mcp = { path = "crates/mcp" }
|
||
vectorcraft-testkit = { path = "crates/testkit" }
|
||
vectorcraft-cad = { path = "crates/cad" }
|
||
vectorcraft-eps = { path = "crates/eps" }
|
||
vectorcraft-metafile = { path = "crates/metafile" }
|
||
vectorcraft-plugins = { path = "crates/plugins" }
|
||
vectorcraft-affinity = { path = "crates/affinity" }
|
||
vectorcraft-scriptcheck = { path = "crates/scriptcheck" }
|
||
vectorcraft-apischema = { path = "crates/apischema" }
|
||
|
||
# foundation
|
||
kurbo = { version = "0.13", features = ["serde"] }
|
||
peniko = "0.6"
|
||
thiserror = "2"
|
||
serde = { version = "1", features = ["derive", "rc"] }
|
||
serde_json = { version = "1", features = ["float_roundtrip"] }
|
||
log = "0.4"
|
||
# All date/time conversion goes through chrono (no hand-rolled calendar code beyond the 400-year range extension; AGENTS.md).
|
||
chrono = { version = "0.4.45", default-features = false, features = ["std"] }
|
||
proptest = "1"
|
||
crc32fast = "1.5"
|
||
# tests: a TCP port bound without listening (connections to it are refused)
|
||
socket2 = "0.6"
|
||
# Sandboxed WebAssembly plug-ins: a pure-Rust interpreter (MIT OR Apache-2.0) that builds for wasm32
|
||
# too. Without `wat` (text parsing is test-only) and memory64; `validate` keeps full module
|
||
# validation on; the portable dispatcher can't overflow the host stack on long-running modules.
|
||
wasmi = { version = "2.0.0", default-features = false, features = ["std", "validate", "stable", "portable-dispatch"] }
|
||
# Tests: WebAssembly text -> binary for the plug-in fixtures (Apache-2.0 WITH LLVM-exception).
|
||
wat = "1.228"
|
||
|
||
# rendering / formats
|
||
# Without `text` (glyph runs, through glifo and a second skrifa): the renderer draws the outlines
|
||
# vectorcraft-text gives it. The other default features stay.
|
||
vello_cpu = { version = "0.2", default-features = false, features = ["std", "png", "u8_pipeline", "f32_pipeline"] }
|
||
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp", "gif", "tiff", "bmp", "tga"] }
|
||
# Without `text` and the system fonts (fontdb, harfrust and skrifa, at other versions than ours):
|
||
# SVG import reads `<text>` from the XML itself and never gives usvg a font. A test of the SVG
|
||
# crate turns `text` on.
|
||
usvg = { version = "0.48", default-features = false, features = ["svgz"] }
|
||
# Without `simple-text` (its text shaping, the only user of rustybuzz and ttf-parser, which are
|
||
# unmaintained, #1730): the PDF writer places glyphs itself. A test of the PDF crate turns it on.
|
||
krilla = { version = "0.8", default-features = false, features = ["raster-images"] }
|
||
skrifa = "0.47"
|
||
harfrust = "0.13"
|
||
linesweeper = "0.5"
|
||
flate2 = { version = "1", default-features = false, features = ["rust_backend"] }
|
||
rustix = { version = "1.1", default-features = false }
|
||
# Zstandard decoder (pure Rust, builds for wasm32 too): the editing copy an EPS carries of its art.
|
||
ruzstd = { version = "0.9.1", default-features = false, features = ["std"] }
|
||
# CCITT Group 3 and Group 4 decoder (ITU-T T.4 and T.6): EPS images read through
|
||
# `CCITTFaxDecode`. The PDF reader's hayro-syntax uses the same version.
|
||
hayro-ccitt = "0.3"
|
||
# Substring search for the EPS reader's PostScript `search`.
|
||
memchr = "2"
|
||
jpeg-encoder = { version = "0.6", default-features = false, features = ["std"] }
|
||
gif = { version = "0.14", default-features = false, features = ["std", "raii_no_panic"] }
|
||
# CMYK image samples (vectorcraft-doc's cmyk module): the image crate's own TIFF and JPEG
|
||
# decoders, read directly (the image crate converts CMYK to RGB).
|
||
tiff = "0.11"
|
||
zune-jpeg = "0.5"
|
||
|
||
# ui
|
||
egui = "0.37"
|
||
egui_extras = { version = "0.37", default-features = false, features = ["svg"] }
|
||
eframe = { version = "0.37", default-features = false }
|
||
egui_kittest = "0.37"
|
||
rfd = "0.17"
|
||
arboard = { version = "3.6", default-features = false }
|
||
clipboard-win = "5.4"
|
||
webbrowser = "1"
|
||
|
||
[workspace.lints.rust]
|
||
unsafe_code = "deny"
|
||
|
||
[workspace.lints.clippy]
|
||
cognitive_complexity = "deny"
|
||
too_many_arguments = "deny"
|
||
wildcard_imports = "deny"
|
||
dbg_macro = "warn"
|
||
# VectorCraft never crashes: shipped code returns `Result`/`Option` instead of panicking (see
|
||
# AGENTS.md › Robustness). Tests may unwrap (clippy.toml).
|
||
unwrap_used = "deny"
|
||
expect_used = "deny"
|
||
panic = "deny"
|
||
todo = "deny"
|
||
unimplemented = "deny"
|
||
unreachable = "deny"
|
||
|
||
# Workspace crates keep line tables, so panics and backtraces name file and line; dependencies
|
||
# carry no debug info. Full debug info would make the dev target dir several times larger.
|
||
[profile.dev.package."*"]
|
||
opt-level = 2
|
||
debug = false
|
||
|
||
[profile.dev]
|
||
opt-level = 1
|
||
debug = "line-tables-only"
|
||
|
||
[profile.release]
|
||
lto = "thin"
|
||
codegen-units = 1
|
||
|
||
[patch.crates-io]
|
||
hayro-syntax = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
hayro-interpret = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
hayro-jbig2 = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
hayro-cmap = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
hayro-postscript = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
krilla = { git = "https://github.com/storytold/craft-libs", rev = "9be9a63782298ab59cd9b7a42ee9cba4f42a5ccb" }
|
||
ecolor = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
emath = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
epaint = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
epaint_default_fonts = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui-winit = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui-wgpu = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui_glow = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui_extras = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui_kittest = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui_system_font_provider = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
eframe = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui_demo_lib = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
egui_inspection = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
||
winit = { git = "https://github.com/storytold/winit.git", rev = "a517b3846ee8457d84ee4975110bfda6797c44dc" }
|