#![no_std]
#[macro_use]
extern crate alloc;
#[macro_use]
extern crate sys;
extern crate playdate_fs as fs;
use core::ffi::*;
use core::ptr::null_mut;
use alloc::string::String;
use fs::FileSystem;
use sys::ffi::*;
use fs::options::FileOptionsExt;
use fs::options::OpenOptions;
use fs::Path;
fn list_bundle_dir() -> Result<(), fs::error::ApiError> {
let fs = fs::Fs::new()?;
let include_hidden = true;
println!("Listing root dir...");
fs.read_dir("/", |path| println!(" {path}"), include_hidden)?;
Ok(())
}
const DIR: &Path = "temp";
const FILE: &Path = "temp/temp-file";
fn write_file() -> Result<(), fs::error::ApiError> {
let fs = fs::Fs::new()?;
let exists = fs.metadata(FILE).is_ok();
if exists {
println!("file already exists, overwriting");
} else {
println!("file doesn't exists, creating new");
fs.create_dir(DIR)?;
}
let text = "Hello, World!";
println!("writing '{text}' to '{FILE}'");
let mut file = FileOptions::new().write(true).open_using(FILE, &fs)?;
let bytes_written = fs.write(&mut file, text.as_bytes())?;
println!("written {bytes_written} bytes");
Ok(())
}
fn read_file() -> Result<(), fs::error::ApiError> {
let fs = fs::Fs::new()?;
println!("reading file metadata");
let info = fs.metadata(&FILE)?;
println!("info: {info:?}");
println!("preparing buffer for {} bytes", info.size);
let mut buf = vec![0_u8; info.size as usize];
let mut file = FileOptions::new().read(true)
.read_data(true)
.open_using(FILE, &fs)?;
println!("reading '{FILE}'");
let bytes_read = file.read(&mut buf, info.size)?;
println!("read {bytes_read} bytes");
let result = String::from_utf8(buf)?;
println!("content:\n{result}");
Ok(())
}
fn read_package_info() -> Result<(), fs::error::ApiError> {
println!("reading pdxinfo");
let text = fs::read_to_string("pdxinfo", false)?;
println!("{text}");
Ok(())
}
#[no_mangle]
pub extern "C" fn eventHandlerShim(api: *const PlaydateAPI, event: PDSystemEvent, _arg: u32) -> c_int {
match event {
PDSystemEvent::kEventInit => unsafe {
sys::API = api;
let f = api!(system.setUpdateCallback);
unsafe extern "C" fn on_update(_: *mut c_void) -> i32 { 0 }
f(Some(on_update), null_mut());
list_bundle_dir().expect("list_bundle_dir");
write_file().expect("write_file");
read_file().expect("read_file");
read_package_info().expect("read_package_info");
},
_ => {},
}
0
}
ll_symbols!();