mirror of
https://github.com/storytold/craft-libs.git
synced 2026-11-12 10:03:51 +00:00
MailCraft and WordCraft each parse MIME: MailCraft for mail (crates/mime, crates/charset), WordCraft for MHT web archives (formats/src/mht.rs). This adds one shared crate for the format, taken from MailCraft's code where it is format code, with WordCraft's multipart/related lookups and its fix for comments in Content-Type. Reader: parse() gives a tree of parts (header fields, content type and parameters, decoded body, charset-decoded text). It never fails or panics, is linear in the input, and is bounded by Limits (input size, header count and sizes, depth, part count, decoded size); Message::truncated reports a limit that left something out. Writer: Entity::text / file / multipart and write_message, with folded headers, RFC 2047 and RFC 2231 encoding, quoted-printable and base64 with line limits, and boundaries checked against the content. Every header value loses CR, LF and NUL, and a name that is no field name is not written. Also: address lists, mbox splitting and writing on raw message bytes, and Date parsing and formatting on a plain struct (chrono is a private dependency; no date type is in the public API). No app is switched here. The README has the migration tables and says what stays in the apps.
120 lines
6.1 KiB
TOML
120 lines
6.1 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["crates/*"]
|
|
exclude = ["vendor/krilla", "vendor/hayro", "vendor/hayro-interpret", "vendor/hayro-syntax", "vendor/hayro-jbig2", "vendor/hayro-cmap", "vendor/hayro-postscript", "vendor/linesweeper"]
|
|
|
|
[workspace.package]
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.95"
|
|
repository = "https://github.com/storytold/craft-libs"
|
|
|
|
[workspace.dependencies]
|
|
# internal: add each crate here as `craft-<name> = { path = "crates/<name>" }`
|
|
craft-platform = { path = "crates/platform" }
|
|
craft-ai-core = { path = "crates/ai-core" }
|
|
craft-pdf = { path = "crates/pdf", version = "=0.1.0" }
|
|
craft-plate-test = { path = "crates/plate-test" }
|
|
krilla = { version = "=0.8.2", default-features = false, features = ["raster-images"] }
|
|
hayro = { version = "=0.7.1", default-features = false }
|
|
hayro-interpret = { version = "=0.7.0", default-features = false, features = ["embed-fonts", "embed-cmaps"] }
|
|
hayro-syntax = { version = "=0.7.2", default-features = false, features = ["std"] }
|
|
bytemuck = "1"
|
|
kurbo = "0.13"
|
|
thiserror = "2"
|
|
craft-atomic = { path = "crates/atomic" }
|
|
craft-cms = { path = "crates/cms" }
|
|
craft-crw = { path = "crates/crw" }
|
|
craft-dialogs = { path = "crates/dialogs" }
|
|
craft-dxf = { path = "crates/dxf" }
|
|
craft-doc = { path = "crates/doc" }
|
|
craft-docpath = { path = "crates/docpath" }
|
|
craft-ecproj-format = { path = "crates/ecproj-format" }
|
|
craft-font-catalog = { path = "crates/font-catalog" }
|
|
craft-font-manager = { path = "crates/font-manager" }
|
|
craft-font-store = { path = "crates/font-store" }
|
|
craft-gcode = { path = "crates/gcode" }
|
|
craft-heif = { path = "crates/heif" }
|
|
craft-fonts-build = { path = "crates/fonts-build" }
|
|
craft-i18n = { path = "crates/i18n" }
|
|
craft-jpeg = { path = "crates/jpeg" }
|
|
craft-keymap = { path = "crates/keymap" }
|
|
craft-audio = { path = "crates/audio" }
|
|
# No default features, so craft-audio's `encode` builds craft-media without `isobmff`.
|
|
craft-media = { path = "crates/media", default-features = false }
|
|
craft-media-testkit = { path = "crates/media-testkit" }
|
|
craft-mime = { path = "crates/mime" }
|
|
craft-menu = { path = "crates/menu" }
|
|
craft-pcraft-format = { path = "crates/pcraft-format" }
|
|
craft-prepress = { path = "crates/prepress" }
|
|
craft-print = { path = "crates/print" }
|
|
craft-proof = { path = "crates/proof" }
|
|
craft-quit = { path = "crates/quit" }
|
|
craft-settings = { path = "crates/settings" }
|
|
craft-silhouette-studio = { path = "crates/silhouette-studio" }
|
|
craft-svg-paths = { path = "crates/svg-paths" }
|
|
craft-text = { path = "crates/text" }
|
|
craft-tiff = { path = "crates/tiff" }
|
|
craft-ui = { path = "crates/ui" }
|
|
craft-update = { path = "crates/update" }
|
|
craft-vectorcraft-format = { path = "crates/vectorcraft-format" }
|
|
craft-video = { path = "crates/video" }
|
|
craft-web-api = { path = "crates/web-api" }
|
|
craft-window = { path = "crates/window" }
|
|
craft-web-host = { path = "crates/web-host" }
|
|
egui = { version = "0.37", default-features = false }
|
|
md5 = { package = "md-5", version = "0.10", default-features = false }
|
|
rayon = "1"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
proptest = "1"
|
|
# Character sets of the WHATWG Encoding Standard (craft-mime). (Apache-2.0 OR MIT) AND BSD-3-Clause.
|
|
encoding_rs = "0.8"
|
|
# 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"] }
|
|
|
|
[workspace.lints.rust]
|
|
unsafe_code = "forbid"
|
|
unexpected_cfgs = { level = "warn", check-cfg = ["cfg(craft_pdf_unicode_fixtures)"] }
|
|
|
|
[workspace.lints.clippy]
|
|
cognitive_complexity = "deny"
|
|
too_many_arguments = "deny"
|
|
wildcard_imports = "deny"
|
|
dbg_macro = "warn"
|
|
todo = "warn"
|
|
|
|
[patch.crates-io]
|
|
krilla = { path = "vendor/krilla" }
|
|
|
|
hayro = { path = "vendor/hayro" }
|
|
hayro-interpret = { path = "vendor/hayro-interpret" }
|
|
hayro-syntax = { path = "vendor/hayro-syntax" }
|
|
hayro-jbig2 = { path = "vendor/hayro-jbig2" }
|
|
hayro-cmap = { path = "vendor/hayro-cmap" }
|
|
hayro-postscript = { path = "vendor/hayro-postscript" }
|
|
linesweeper = { path = "vendor/linesweeper" }
|
|
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" }
|
|
|
|
# symphonia's FLAC decoder restores LPC samples as `residual + (prediction as i32)`. In a valid
|
|
# 32-bit stream the prediction can leave the i32 range while the sum does not, so a debug build
|
|
# panics where a release build wraps to the right sample. Apps that decode 32-bit FLAC through
|
|
# craft-audio's `decode` need the same override in their own workspace.
|
|
[profile.dev.package.symphonia-bundle-flac]
|
|
overflow-checks = false
|