applin-rust ====== [![crates.io version](https://img.shields.io/crates/v/applin.svg)](https://crates.io/crates/applin) [![unsafe forbidden](https://raw.githubusercontent.com/leonhard-llc/applin-rust/main/unsafe-forbidden-success.svg)](https://github.com/rust-secure-code/safety-dance/) [![pipeline status](https://github.com/leonhard-llc/applin-rust/workflows/CI/badge.svg)](https://github.com/leonhard-llc/applin-rust/actions) You can use the Applinβ„’ Server-Driven UI framework to build a mobile app with only server-side code. Use a provided boilerplate app for the frontend. Use this library for the backend. Documentation: Example and live demo: Related crate: [applin_headless](https://crates.io/crates/applin_headless) # Cargo Geiger Safety Report ``` Metric output format: x/y x = unsafe code used by the build y = total unsafe code found in the crate Symbols: πŸ”’ = No `unsafe` usage found, declares #![forbid(unsafe_code)] ❓ = No `unsafe` usage found, missing #![forbid(unsafe_code)] ☒️ = `unsafe` usage found Functions Expressions Impls Traits Methods Dependency 0/0 0/0 0/0 0/0 0/0 πŸ”’ applin 0.2.9 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”œβ”€β”€ servlin 0.6.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”œβ”€β”€ safina 0.6.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”œβ”€β”€ async-fs 2.1.2 4/4 222/222 40/40 0/0 13/13 ☒️ β”‚ β”‚ β”œβ”€β”€ async-lock 3.4.0 0/0 2/2 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ event-listener-strategy 0.5.2 0/0 39/49 8/12 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ event-listener 5.3.1 0/0 183/183 2/2 0/0 1/1 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ concurrent-queue 2.5.0 4/4 12/75 4/16 0/0 0/3 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── crossbeam-utils 0.8.20 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ parking 2.2.1 0/0 11/191 0/0 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ └── pin-project-lite 0.2.14 0/0 11/191 0/0 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”‚ └── pin-project-lite 0.2.14 0/0 39/49 8/12 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ event-listener 5.3.1 0/0 11/191 0/0 0/0 2/2 ☒️ β”‚ β”‚ β”‚ └── pin-project-lite 0.2.14 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”œβ”€β”€ blocking 1.6.1 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”‚ β”œβ”€β”€ async-channel 2.3.1 0/0 183/183 2/2 0/0 1/1 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ concurrent-queue 2.5.0 0/0 2/2 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ event-listener-strategy 0.5.2 0/0 36/36 2/2 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ futures-core 0.3.31 0/0 11/191 0/0 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”‚ └── pin-project-lite 0.2.14 1/1 860/866 4/4 0/0 13/13 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ async-task 4.7.1 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”œβ”€β”€ futures-io 0.3.31 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”œβ”€β”€ futures-lite 2.3.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ fastrand 2.1.1 0/0 36/36 2/2 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ futures-core 0.3.31 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ futures-io 0.3.31 27/41 1973/2421 2/2 0/0 109/147 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ memchr 2.7.4 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ parking 2.2.1 0/0 11/191 0/0 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”‚ └── pin-project-lite 0.2.14 0/0 28/28 2/2 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ piper 0.2.4 0/0 32/32 2/2 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ atomic-waker 1.1.2 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ fastrand 2.1.1 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ └── futures-io 0.3.31 0/0 14/14 1/1 0/0 0/0 ☒️ β”‚ β”‚ β”‚ └── tracing 0.1.40 0/0 11/191 0/0 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ pin-project-lite 0.2.14 0/0 96/96 5/5 0/0 2/2 ☒️ β”‚ β”‚ β”‚ └── tracing-core 0.1.32 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ └── futures-lite 2.3.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”œβ”€β”€ async-net 2.0.0 0/0 68/114 19/22 1/1 4/8 ☒️ β”‚ β”‚ β”œβ”€β”€ async-io 2.3.4 4/4 222/222 40/40 0/0 13/13 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ async-lock 3.4.0 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”œβ”€β”€ cfg-if 1.0.0 0/0 183/183 2/2 0/0 1/1 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ concurrent-queue 2.5.0 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”œβ”€β”€ futures-io 0.3.31 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”œβ”€β”€ futures-lite 2.3.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”‚ β”œβ”€β”€ parking 2.2.1 0/2 34/420 5/20 1/4 5/14 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ polling 3.7.3 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ cfg-if 1.0.0 53/389 2527/7252 6/8 1/1 20/35 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ rustix 0.38.37 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ bitflags 2.6.0 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── serde 1.0.211 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── serde_derive 1.0.211 0/0 15/15 0/0 0/0 3/3 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ proc-macro2 1.0.88 0/0 4/4 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── unicode-ident 1.0.13 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ quote 1.0.37 0/0 15/15 0/0 0/0 3/3 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── proc-macro2 1.0.88 0/0 88/88 3/3 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── syn 2.0.82 0/0 15/15 0/0 0/0 3/3 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ proc-macro2 1.0.88 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ quote 1.0.37 0/0 4/4 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── unicode-ident 1.0.13 0/0 35/103 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ errno 0.3.9 1/90 10/596 0/2 0/0 5/69 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── libc 0.2.161 0/0 7/7 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ itoa 1.0.11 1/90 10/596 0/2 0/0 5/69 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ └── libc 0.2.161 0/0 14/14 1/1 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ └── tracing 0.1.40 53/389 2527/7252 6/8 1/1 20/35 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ rustix 0.38.37 0/0 23/23 0/0 0/0 3/3 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ slab 0.4.9 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ └── serde 1.0.211 0/0 14/14 1/1 0/0 0/0 ☒️ β”‚ β”‚ β”‚ └── tracing 0.1.40 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”œβ”€β”€ blocking 1.6.1 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ └── futures-lite 2.3.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”œβ”€β”€ fixed-buffer 1.0.0 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ └── futures-io 0.3.31 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”œβ”€β”€ futures-io 0.3.31 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”œβ”€β”€ futures-lite 2.3.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”œβ”€β”€ permit 0.2.1 0/0 32/32 0/0 0/0 0/0 ☒️ β”‚ β”œβ”€β”€ rand 0.8.5 1/90 10/596 0/2 0/0 5/69 ☒️ β”‚ β”‚ β”œβ”€β”€ libc 0.2.161 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”œβ”€β”€ rand_chacha 0.3.1 2/2 632/680 0/0 0/0 17/25 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ ppv-lite86 0.2.20 2/2 116/116 7/7 8/8 8/8 ☒️ β”‚ β”‚ β”‚ β”‚ └── zerocopy 0.7.35 0/1 162/179 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ byteorder 1.5.0 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ └── zerocopy-derive 0.7.35 0/0 15/15 0/0 0/0 3/3 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ proc-macro2 1.0.88 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ quote 1.0.37 0/0 88/88 3/3 0/0 2/2 ☒️ β”‚ β”‚ β”‚ β”‚ └── syn 2.0.82 0/0 2/2 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”œβ”€β”€ rand_core 0.6.4 3/6 51/192 0/1 0/0 1/3 ☒️ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ getrandom 0.2.15 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ cfg-if 1.0.0 1/90 10/596 0/2 0/0 5/69 ☒️ β”‚ β”‚ β”‚ β”‚ β”‚ └── libc 0.2.161 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ β”‚ └── serde 1.0.211 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ └── serde 1.0.211 0/0 2/2 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”œβ”€β”€ rand_core 0.6.4 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ └── serde 1.0.211 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”œβ”€β”€ safe-regex 0.3.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ └── safe-regex-macro 0.3.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”œβ”€β”€ safe-proc-macro2 1.0.67 0/0 4/4 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ └── unicode-ident 1.0.13 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ └── safe-regex-compiler 0.3.0 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ β”œβ”€β”€ safe-proc-macro2 1.0.67 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ └── safe-quote 1.0.15 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ └── safe-proc-macro2 1.0.67 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”œβ”€β”€ serde 1.0.211 0/0 66/69 0/0 0/0 0/0 ☒️ β”‚ β”œβ”€β”€ serde_json 1.0.132 0/0 7/7 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”œβ”€β”€ itoa 1.0.11 27/41 1973/2421 2/2 0/0 109/147 ☒️ β”‚ β”‚ β”œβ”€β”€ memchr 2.7.4 7/9 572/702 0/0 0/0 2/2 ☒️ β”‚ β”‚ β”œβ”€β”€ ryu 1.0.18 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ └── serde 1.0.211 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”œβ”€β”€ temp-dir 0.1.14 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”œβ”€β”€ temp-file 0.1.9 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ └── url 2.5.2 0/0 2/2 0/0 0/0 0/0 ☒️ β”‚ β”œβ”€β”€ form_urlencoded 1.2.1 0/0 8/8 0/0 0/0 0/0 ☒️ β”‚ β”‚ └── percent-encoding 2.3.1 0/0 0/0 0/0 0/0 0/0 ❓ β”‚ β”œβ”€β”€ idna 0.5.0 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”œβ”€β”€ unicode-bidi 0.3.17 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”‚ └── serde 1.0.211 1/1 24/24 0/0 0/0 0/0 ☒️ β”‚ β”‚ └── unicode-normalization 0.1.24 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ └── tinyvec 1.8.0 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ β”‚ β”œβ”€β”€ serde 1.0.211 0/0 0/0 0/0 0/0 0/0 πŸ”’ β”‚ β”‚ └── tinyvec_macros 0.1.1 0/0 8/8 0/0 0/0 0/0 ☒️ β”‚ β”œβ”€β”€ percent-encoding 2.3.1 0/0 5/5 0/0 0/0 0/0 ☒️ β”‚ └── serde 1.0.211 0/0 7/20 0/0 0/0 0/0 ☒️ β”œβ”€β”€ nanorand 0.7.0 3/6 51/192 0/1 0/0 1/3 ☒️ β”‚ └── getrandom 0.2.15 0/0 5/5 0/0 0/0 0/0 ☒️ β”œβ”€β”€ serde 1.0.211 0/0 66/69 0/0 0/0 0/0 ☒️ └── serde_json 1.0.132 105/552 8003/14873 112/151 11/14 212/355 ``` # Changelog - v0.2.9 2024-10-26 - Add `ModalButton::new` and `ModalButton::with_actions`. - Upgrade to `servlin` v0.6. - v0.2.8 - Make debug formatting more concise by using JSON, for better test failure messages. - v0.2.7 - Support `ApplinIos` 0.38.0. - Add `checkbox_button`. - v0.2.6 - Add `RowList::push`, `RowList::new`, `OptWidgetList::push`, and `OptWidgetList::new`. - v0.2.5 - Add `WidgetList::push` and `WidgetList::new`. - v0.2.4 - Support `ApplinIos` 0.36.0. - Add `reset_var` and `stop_actions` actions. - v0.2.3 - Add `id` field to `Action` and `ModalButton`, for testing. - v0.2.2 - Add `with_validated` to input widgets. Supports `ApplinIos` 0.33.0. - v0.2.1 - Add `id` fields for testing. - Make `Action` fields public. - Make `Real32` and enums `Copy`. - v0.2.0 - Support `ApplinIos` 0.32.0. - Remove `on_user_error_poll` action and make it a parameter of the `rpc` action. - v0.1.7 - Support `ApplinIos` 0.31.0. - Add `modal` action. - Add `aspect_ratio` to `choose_photo` and `take_photo` actions. - v0.1.6 - Support `ApplinIos` 0.28.0. - Add `logout` action. - Add `selector` widget. - v0.1.5 - Support `ApplinIos` 0.25.0. - Add `poll_delay_ms` to checkbox and textfield. - Replace checkbox `rpc` field with `actions`. - v0.1.4 - Add `From>>` for `Widget` for use with `error_text`. - Add `SessionCookie`, `Id`, and `Secret`. - Organize into modules for easier discovery. - v0.1.3 - Add `on_user_error_poll` action. - v0.1.2 - Bugfixes - v0.1.1 - Update documentation. - v0.1.0 - First published version