inputbox
A cross-platform, native GUI input box for Rust. Yes, finally.
The Story
Picture this: you're writing a Rust CLI tool and you just want to pop up a little dialog that says "hey, what's your name?" and take whatever the user types. Simple, right?
So you look at the ecosystem.
rfd: Rusty File Dialogs! Cross-platform! Async! Beautiful! ...opens files. Not text. Files.native-dialog: Again, no input box, just message boxes and file pickers.tinyfiledialogs:input_boxlooks promising! ...but why does my input box turn into a password input whendefaultis empty (Some(""))? No multiline, no custom labels, no control over backends... Oh and it's a C binding.dialog: Finally, an input box! ...but not for Windows or macOS. It fully depends on tools likezenity,kdialogordialog.
You stare into the void. The void stares back. You write the dialog in HTML/JS because at least Electron works on all platforms.
Not anymore.
What inputbox Does
inputbox is a minimal, cross-platform Rust library that shows a native GUI input dialog and returns what the user typed. It uses whatever is available on the system. Should work™ most of the time.
Quick Start
[]
= "0.1.0"
use InputBox;
Examples
Password Input
use ;
let result = new
.title
.prompt
.mode
.show
.unwrap;
Custom Buttons and Dimensions
use InputBox;
let result = new
.title
.prompt
.ok_label
.cancel_label
.width
.height
.show
.unwrap;
Asynchronous Usage
use InputBox;
new
.title
.prompt
.show_async;
Note: On iOS, you must use async methods. See the documentation for details.
Features
- Multiple input modes — text, password, or multiline
- Highly customizable — title, prompt, button labels, dimensions, and more
- Works on most platforms — Windows, macOS, Linux, Android, iOS and OpenHarmony
- Pluggable backends — use a specific backend or let the library pick
- Synchronous and asynchronous — safe sync on most platforms, async required on iOS
Backends
| Backend | Platform | How it works | Extra setup |
|---|---|---|---|
PSScript |
Windows | PowerShell + WinForms, no extra install needed | None |
JXAScript |
macOS | osascript JXA, built into the OS |
None |
Android |
Android | AAR + JNI to show an Android AlertDialog | See Android Setup |
IOS |
iOS | UIKit alert | None |
OHOS |
OpenHarmony | NAPI + ArkTS dialog | See OHOS Setup |
Yad |
Linux | yad |
Install yad |
Zenity |
Linux | zenity — fallback on GNOME systems |
Install zenity |
Android Setup
You need to include AAR in your Android project to use the Android backend. The AAR is bundled with the crate, but you need to configure your Gradle build to find it.
Gradle Setup
Inside of your project's settings.gradle file, add the following code and Maven repository definition.
$PATH_TO_DEPENDENT_CRATE is the relative path to the Cargo manifest (Cargo.toml) of any crate in your workspace that depends on inputbox from the location of your settings.gradle file:
dependencyResolutionManagement
def dependencyText = providers.exec .standardOutput.asText.
def dependencyJson = new JsonSlurper().
def manifestPath =
return new File(manifestPath.parentFile, "maven").path
}
Then, wherever you declare your dependencies, add the following:
implementation "moe.mivik:inputbox:latest.release"
Crate initialization
The jni crate must be initialized before the crate can interact with the JVM. Add the following code to your native library's initialization function:
// `jni` crate v0.22 or higher
extern "system"
// Earlier versions of `jni` or other JNI bindings
extern "system"
OHOS Setup
Currently you need to implement the ArkTS dialog yourself and use registerInputboxCallback to connect it to inputbox. See the OHOS example for setup details.
License
MIT