use bashkit::Bash;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
println!("=== Text File Pre-population Example ===\n");
basic_text_files().await?;
println!();
readonly_config_files().await?;
println!();
json_data_files().await?;
println!();
mixed_permissions().await?;
Ok(())
}
async fn basic_text_files() -> anyhow::Result<()> {
println!("--- Basic Text Files ---");
let mut bash = Bash::builder()
.mount_text(
"/config/app.conf",
"debug=true\nport=8080\nhost=localhost\n",
)
.mount_text("/data/greeting.txt", "Hello from pre-populated file!")
.build();
println!("Reading config file:");
let result = bash.exec("cat /config/app.conf").await?;
print!("{}", result.stdout);
println!("\nGreeting file:");
let result = bash.exec("cat /data/greeting.txt").await?;
println!("{}", result.stdout);
bash.exec("echo 'log_level=info' >> /config/app.conf")
.await?;
println!("After appending to config:");
let result = bash.exec("cat /config/app.conf").await?;
print!("{}", result.stdout);
Ok(())
}
async fn readonly_config_files() -> anyhow::Result<()> {
println!("--- Readonly Configuration Files ---");
let bash = Bash::builder()
.mount_readonly_text("/etc/version", "1.2.3")
.mount_readonly_text(
"/etc/system.conf",
"# System configuration (readonly)\nmode=production\n",
)
.build();
println!("System version:");
let mut bash_mut = bash;
let result = bash_mut.exec("cat /etc/version").await?;
println!("{}", result.stdout);
let stat = bash_mut
.fs()
.stat(std::path::Path::new("/etc/version"))
.await?;
println!("Permission mode: {:o} (readonly)", stat.mode);
Ok(())
}
async fn json_data_files() -> anyhow::Result<()> {
println!("--- JSON Data Files ---");
let mut bash = Bash::builder()
.mount_text(
"/data/users.json",
r#"[{"name": "alice", "role": "admin"}, {"name": "bob", "role": "user"}]"#,
)
.mount_text(
"/data/config.json",
r#"{"api_url": "https://api.example.com", "timeout": 30}"#,
)
.build();
println!("User data:");
let result = bash.exec("cat /data/users.json | jq '.[0].name'").await?;
print!("First user: {}", result.stdout);
println!("Config data:");
let result = bash.exec("cat /data/config.json | jq '.timeout'").await?;
print!("Timeout: {}", result.stdout);
Ok(())
}
async fn mixed_permissions() -> anyhow::Result<()> {
println!("--- Mixed Permissions ---");
let bash = Bash::builder()
.mount_readonly_text("/etc/hostname", "sandbox-host")
.mount_readonly_text("/etc/os-release", "NAME=\"Bashkit\"\nVERSION=\"1.0\"\n")
.mount_text("/workspace/notes.txt", "Initial notes\n")
.mount_text(
"/workspace/data.csv",
"id,name,value\n1,foo,100\n2,bar,200\n",
)
.build();
let mut bash = bash;
println!("Hostname:");
let result = bash.exec("cat /etc/hostname").await?;
println!("{}", result.stdout);
println!("CSV data:");
let result = bash.exec("cat /workspace/data.csv | head -2").await?;
print!("{}", result.stdout);
bash.exec("echo '3,baz,300' >> /workspace/data.csv").await?;
println!("\nAfter adding row:");
let result = bash.exec("cat /workspace/data.csv").await?;
print!("{}", result.stdout);
Ok(())
}