Skip to content

Commit

Permalink
feat(api): Add append option to writeFile apis (#7636)
Browse files Browse the repository at this point in the history
* feat(api): Add `append` option to writeFile apis.

* wording

* fmt

* Update .changes/fs-append-file.md


* clippeeeyyyy
  • Loading branch information
FabianLars committed Aug 16, 2023
1 parent 964d81f commit 58d6b89
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
6 changes: 6 additions & 0 deletions .changes/fs-append-file.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@tauri-apps/api': 'patch:enhance'
'tauri': 'patch:enhance'
---

Add `append` option to `FsOptions` in the `fs` JS module, used in `writeTextFile` and `writeBinaryFile`, to be able to append to existing files instead of overwriting it.
20 changes: 18 additions & 2 deletions core/tauri/src/endpoints/file_system.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ use serde::{
};
use tauri_macros::{command_enum, module_command_handler, CommandModule};

use std::fmt::{Debug, Formatter};
use std::{
fmt::{Debug, Formatter},
fs::OpenOptions,
};
use std::{
fs,
fs::File,
Expand All @@ -49,6 +52,8 @@ pub struct FileOperationOptions {
/// The base directory of the operation.
/// The directory path of the BaseDirectory will be the prefix of the defined file path.
pub dir: Option<BaseDirectory>,
/// Whether writeFile should append to a file or truncate it.
pub append: Option<bool>,
}

/// The API descriptor.
Expand Down Expand Up @@ -166,14 +171,24 @@ impl Cmd {
contents: Vec<u8>,
options: Option<FileOperationOptions>,
) -> super::Result<()> {
let append = options
.as_ref()
.and_then(|opt| opt.append)
.unwrap_or_default();

let resolved_path = resolve_path(
&context.config,
&context.package_info,
&context.window,
path,
options.and_then(|o| o.dir),
)?;
File::create(&resolved_path)

OpenOptions::new()
.append(append)
.write(true)
.create(true)
.open(&resolved_path)
.with_context(|| format!("path: {}", resolved_path.display()))
.map_err(Into::into)
.and_then(|mut f| f.write_all(&contents).map_err(|err| err.into()))
Expand Down Expand Up @@ -409,6 +424,7 @@ mod tests {
fn arbitrary(g: &mut Gen) -> Self {
Self {
dir: Option::arbitrary(g),
append: Option::arbitrary(g),
}
}
}
Expand Down
6 changes: 6 additions & 0 deletions tooling/api/src/fs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ export enum BaseDirectory {
*/
interface FsOptions {
dir?: BaseDirectory
/**
* Whether the content should overwrite the content of the file or append to it.
*
* @since 1.5.0
*/
append?: boolean
// note that adding fields here needs a change in the writeBinaryFile check
}

Expand Down

0 comments on commit 58d6b89

Please sign in to comment.