Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: backup and restore of samples using yaml file #3

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 98 additions & 12 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ clap = { version = "4.1", features = ["derive"] }
humantime = "2.1.0"
tracing = "0.1"
tracing-subscriber = "0.3"
serde = { version = "1.0.196", features = ["derive"] }
serde_yaml = "0.9.31"

[dev-dependencies]
proptest = "1.1.0"
Expand Down
33 changes: 33 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,36 @@ Volsa2 will offer you to backup the sample if the desired slot is occupied.
volsa2-cli remove <sample-no>
```
Erases sample at slot `<sample-no>` from the device memory. Use `-p`/`--print-name` if you want to print the name of the sample.

### Backup (`bk`)
```sh
volsa2-cli backup <backup-directory-path>
```
Creates a folder at `<backup-directory-path>` if one doesn't already exist, and dumps all samples from the Volca Sample 2 into it. Creates a file called layout.yaml in the folder that specifies which samples are to be inserted into which sample slots.

### Restore (`rs`)
```sh
volsa2-cli restore <input-yaml-path>
```
Reads the backup data in the yaml file at `<input-yaml-path>`, and attempts to restore the Volca Sample 2 to the state specified in this yaml file. This means it will clear slots that are not specified in the yaml, and upload the samples that are specified. This expects the samples to be placed in the same directory as the yaml file, and to be named the same as specified in the yaml file but with a `.wav` extension.

For example, your yaml file might look like this:
```yaml
# layout.yaml
sample_slots:
0: bd909
1: bd808
2: bd707
```
and your directory may look like this:
```
sample_backup/
|-bd909.wav
|-bd808.wav
|-bd707.wav
|-layout.yaml
```
When restored, all sample slots on the Volca Sample 2 will be cleared except for the first three which will contain the three `bdx0x.wav` samples.

##### Options:
- `--dry-run` - Check the behaviour without actually modifying anything on the device
77 changes: 77 additions & 0 deletions rustfmt.toml
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this file please.

Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
max_width = 100
hard_tabs = false
tab_spaces = 4
newline_style = "Auto"
indent_style = "Block"
use_small_heuristics = "Default"
fn_call_width = 60
attr_fn_like_width = 70
struct_lit_width = 18
struct_variant_width = 35
array_width = 60
chain_width = 60
single_line_if_else_max_width = 50
wrap_comments = false
format_code_in_doc_comments = false
doc_comment_code_block_width = 100
comment_width = 80
normalize_comments = false
normalize_doc_attributes = false
format_strings = false
format_macro_matchers = false
format_macro_bodies = true
skip_macro_invocations = []
hex_literal_case = "Preserve"
empty_item_single_line = true
struct_lit_single_line = true
fn_single_line = false
where_single_line = false
imports_indent = "Block"
imports_layout = "Mixed"
imports_granularity = "Preserve"
group_imports = "Preserve"
reorder_imports = true
reorder_modules = true
reorder_impl_items = false
type_punctuation_density = "Wide"
space_before_colon = false
space_after_colon = true
spaces_around_ranges = false
binop_separator = "Front"
remove_nested_parens = true
combine_control_expr = true
short_array_element_width_threshold = 10
overflow_delimited_expr = false
struct_field_align_threshold = 0
enum_discrim_align_threshold = 0
match_arm_blocks = true
match_arm_leading_pipes = "Never"
force_multiline_blocks = false
fn_params_layout = "Tall"
brace_style = "SameLineWhere"
control_brace_style = "AlwaysSameLine"
trailing_semicolon = true
trailing_comma = "Vertical"
match_block_trailing_comma = false
blank_lines_upper_bound = 1
blank_lines_lower_bound = 0
edition = "2015"
version = "One"
inline_attribute_width = 0
format_generated_files = true
merge_derives = true
use_try_shorthand = false
use_field_init_shorthand = false
force_explicit_abi = true
condense_wildcard_suffixes = false
color = "Auto"
required_version = "1.5.2"
unstable_features = false
disable_all_formatting = false
skip_children = false
hide_parse_errors = false
error_on_line_overflow = false
error_on_unformatted = false
ignore = []
emit_mode = "Files"
make_backup = false
5 changes: 5 additions & 0 deletions src/domain.rs
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I find this naming ("domain") a little confusing in this crate. While I realise it's more of a personal preference, I think calling this module a "library" and (maybe) reducing nesting (moving BackupData and SampleSlots up) will make it easier to read the code.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
mod backup;
mod sample_slots;

pub use backup::BackupData;
pub use sample_slots::SampleSlots;
16 changes: 16 additions & 0 deletions src/domain/backup.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//! Handles serialization and deserialization of backup structs
use super::sample_slots::SampleSlots;
use serde::{Deserialize, Serialize};
Comment on lines +2 to +3
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please regroup imports the way it's done in other files

// Std
use std::{...};

// External crate
use external_crate::{...};

// This crate
use crate::{...};

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
use super::sample_slots::SampleSlots;
use serde::{Deserialize, Serialize};
use serde::{Deserialize, Serialize};
use super::sample_slots::SampleSlots;


#[derive(Serialize, Deserialize)]
pub struct BackupData {
pub sample_slots: SampleSlots,
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

samples would be better, I believe.

If someday pattern-related stuff gets implemented backups could look like

samples:
    ... # sample data
patterns: # or sequences
    ... # pattern data

}

impl BackupData {
pub fn new() -> Self {
Self {
sample_slots: SampleSlots::new(),
}
}
}
Loading