pub trait OctatrackFileIO:
Decode
+ Encode
+ Serialize
+ for<'a> Deserialize<'a> {
Show 13 methods
// Provided methods
fn repr(&self, newlines: Option<bool>) -> Result<(), Box<dyn Error>>
where Self: Debug { ... }
fn from_data_file(path: &Path) -> Result<Self, Box<dyn Error>> { ... }
fn from_bytes(bytes: &[u8]) -> Result<Self, Box<dyn Error>> { ... }
fn to_data_file(&self, path: &Path) -> Result<(), Box<dyn Error>> { ... }
fn to_bytes(&self) -> Result<Vec<u8>, Box<dyn Error>> { ... }
fn from_yaml_file(path: &Path) -> Result<Self, Box<dyn Error>> { ... }
fn from_yaml_str(yaml: &str) -> Result<Self, Box<dyn Error>> { ... }
fn to_yaml_file(&self, path: &Path) -> Result<(), Box<dyn Error>> { ... }
fn to_yaml_string(&self) -> Result<String, Box<dyn Error>> { ... }
fn from_json_file(path: &Path) -> Result<Self, Box<dyn Error>> { ... }
fn from_json_str(json: &str) -> Result<Self, Box<dyn Error>> { ... }
fn to_json_file(&self, path: &Path) -> Result<(), Box<dyn Error>> { ... }
fn to_json_string(&self) -> Result<String, Box<dyn Error>> { ... }
}Expand description
Convenience trait for types which directly correspond to Elektron Octatrack binary data files.
Associated functions and methods etc. for File I/O, plus a repr method for debugging.
Provided Methods§
Sourcefn repr(&self, newlines: Option<bool>) -> Result<(), Box<dyn Error>>where
Self: Debug,
fn repr(&self, newlines: Option<bool>) -> Result<(), Box<dyn Error>>where
Self: Debug,
Read type from an Octatrack data file at path
use ot_tools_io::{BankFile, OctatrackFileIO};
assert!(BankFile::from_data_file(&path).unwrap().repr(None).is_ok());
assert!(BankFile::from_data_file(&path).unwrap().repr(Some(false)).is_ok());
assert!(BankFile::from_data_file(&path).unwrap().repr(Some(true)).is_ok());Sourcefn from_data_file(path: &Path) -> Result<Self, Box<dyn Error>>
fn from_data_file(path: &Path) -> Result<Self, Box<dyn Error>>
Read type from an Octatrack data file at path
use ot_tools_io::{BankFile, OctatrackFileIO};
let bank = BankFile::from_data_file(&path).unwrap();
assert_eq!(bank.datatype_version, 23);Examples found in repository?
More examples
examples/check_checksums.rs (line 18)
14fn arrangement_check() -> RBoxErr<()> {
15 let fp = PathBuf::from("test-data")
16 .join("arrange")
17 .join("full-options.work");
18 let bin = ArrangementFile::from_data_file(&fp)?;
19 println!("checksum from arrangement file: {:?}", bin.checksum);
20
21 let checksum = bin.calculate_checksum()?;
22 println!("calculated checksum for arrangement file: {checksum:?}");
23
24 if bin.check_checksum()? {
25 println!("arrangement file checksum is ok");
26 } else {
27 println!("bad arrangement file checksum");
28 panic!()
29 };
30 Ok(())
31}
32
33fn bank_check() -> RBoxErr<()> {
34 let fp = PathBuf::from("test-data")
35 .join("blank-project")
36 .join("bank01.work");
37 let bin = BankFile::from_data_file(&fp)?;
38 println!("checksum from bank file: {:?}", bin.checksum);
39
40 let checksum = bin.calculate_checksum()?;
41 println!("calculated checksum for bank file: {checksum:?}");
42
43 if bin.check_checksum()? {
44 println!("bank file checksum is ok");
45 } else {
46 println!("bad bank file checksum");
47 panic!()
48 };
49 Ok(())
50}
51
52fn markers_check() -> RBoxErr<()> {
53 let fp = PathBuf::from("test-data")
54 .join("blank-project")
55 .join("markers.work");
56 let bin = ArrangementFile::from_data_file(&fp)?;
57 println!("checksum from markers file: {:?}", bin.checksum);
58
59 let checksum = bin.calculate_checksum()?;
60 println!("calculated checksum for markers file: {checksum:?}");
61
62 if bin.check_checksum()? {
63 println!("markers file checksum is ok");
64 } else {
65 println!("bad markers file checksum");
66 panic!()
67 };
68
69 Ok(())
70}
71
72fn sample_check() -> RBoxErr<()> {
73 let fp = PathBuf::from("test-data").join("samples").join("sample.ot");
74 let bin = SampleSettingsFile::from_data_file(&fp)?;
75 println!("checksum from sample settings file: {:?}", bin.checksum);
76
77 let checksum = bin.calculate_checksum()?;
78 println!("calculated checksum for sample settings file: {checksum:?}");
79
80 if bin.check_checksum()? {
81 println!("sample settings file checksum is ok");
82 } else {
83 println!("bad sample settings file checksum");
84 panic!()
85 };
86 Ok(())
87}examples/list_sample_slots.rs (line 22)
19fn main() -> RBoxErr<()> {
20 let blank_project_dirpath = PathBuf::from("test-data").join("blank-project");
21 let project_fpath = blank_project_dirpath.join("project.work");
22 let project = ProjectFile::from_data_file(&project_fpath)?;
23
24 println!("====================================");
25 println!("| Project Sample Slots |");
26 println!("====================================");
27 println!("-------------- Static --------------");
28 for (idx, sample_slot) in project.slots.static_slots.iter().enumerate() {
29 println!("Static Slot {}: {sample_slot:?}", idx + 1)
30 }
31 println!("--------------- Flex ---------------");
32 for (idx, sample_slot) in project.slots.flex_slots.iter().enumerate() {
33 println!("Flex Slot {}: {sample_slot:?}", idx + 1)
34 }
35 Ok(())
36}examples/read_project_files.rs (line 27)
19fn main() -> RBoxErr<()> {
20 let blank_project_dirpath = PathBuf::from("test-data").join("blank-project");
21
22 let arr_fpath = blank_project_dirpath.join("arr01.work");
23 let bank_fpath = blank_project_dirpath.join("bank01.work");
24 let markers_fpath = blank_project_dirpath.join("markers.work");
25 let project_fpath = blank_project_dirpath.join("project.work");
26
27 let arr = ArrangementFile::from_data_file(&arr_fpath)?;
28 let bank = BankFile::from_data_file(&bank_fpath)?;
29 let markers = MarkersFile::from_data_file(&markers_fpath)?;
30 let project = ProjectFile::from_data_file(&project_fpath)?;
31
32 let arr_meta = Metadata {
33 header: String::from_utf8_lossy(&arr.header)
34 .to_string()
35 .replace("\0", "."),
36 datatype_version: arr.datatype_version,
37 };
38
39 let bank_meta = Metadata {
40 header: String::from_utf8_lossy(&bank.header)
41 .to_string()
42 .replace("\0", "."),
43 datatype_version: bank.datatype_version,
44 };
45
46 let markers_meta = Metadata {
47 header: String::from_utf8_lossy(&markers.header)
48 .to_string()
49 .replace("\0", "."),
50 datatype_version: markers.datatype_version,
51 };
52
53 println!("===================================");
54 println!("| Printing example files metadata |");
55 println!("===================================");
56 println!();
57 println!("project: {:#?}", project.metadata);
58 println!();
59 println!("arrangement: {arr_meta:#?}");
60 println!();
61 println!("bank: {bank_meta:#?}");
62 println!();
63 println!("markers: {markers_meta:#?}");
64 Ok(())
65}Sourcefn from_bytes(bytes: &[u8]) -> Result<Self, Box<dyn Error>>
fn from_bytes(bytes: &[u8]) -> Result<Self, Box<dyn Error>>
Read type from bytes
// need to create everything from scratch in this example as many bytes otherwise
use serde::{Deserialize, Serialize};
use ot_tools_io::{Decode, Encode, OctatrackFileIO};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Something {
value: u8,
}
impl Decode for Something {}
impl Encode for Something {}
impl OctatrackFileIO for Something {}
let x = [10];
let r = Something::from_bytes(&x);
assert!(r.is_ok());
assert_eq!(r.unwrap(), Something { value: 10});Sourcefn to_data_file(&self, path: &Path) -> Result<(), Box<dyn Error>>
fn to_data_file(&self, path: &Path) -> Result<(), Box<dyn Error>>
Write type to an Octatrack data file at path
use ot_tools_io::{OctatrackFileIO, BankFile};
let r = BankFile::default().to_data_file(&path);
assert!(r.is_ok());
assert!(path.exists());Examples found in repository?
examples/create_new_project_dir.rs (line 25)
19fn main() -> RBoxErr<()> {
20 let project_dirpath = PathBuf::from("example-new-project");
21
22 std::fs::create_dir_all(&project_dirpath)?;
23
24 let proj_fpath = project_dirpath.join("project.work");
25 ProjectFile::default().to_data_file(&proj_fpath)?;
26
27 let markers_fpath = project_dirpath.join("markers.work");
28 MarkersFile::default().to_data_file(&markers_fpath)?;
29
30 for i in 1..=16 {
31 let bank_fpath = project_dirpath.join(bank_fname_from_id(i));
32 BankFile::default().to_data_file(&bank_fpath)?;
33 }
34
35 for i in 1..=8 {
36 let arr_fpath = project_dirpath.join(arr_fname_from_id(i));
37 ArrangementFile::default().to_data_file(&arr_fpath)?;
38 }
39
40 println!("New project created: {project_dirpath:?}");
41 Ok(())
42}More examples
examples/dbg_bank_scene_params.rs (line 25)
19fn new_proj(banks: &[BankFile], proj_id: u32) -> RBoxErr<()> {
20 let project_dirpath = PathBuf::from("dbg").join(format!["PROJECT-{proj_id}"]);
21
22 std::fs::create_dir_all(&project_dirpath)?;
23
24 let proj_fpath = project_dirpath.join("project.work");
25 ProjectFile::default().to_data_file(&proj_fpath)?;
26
27 let markers_fpath = project_dirpath.join("markers.work");
28 MarkersFile::default().to_data_file(&markers_fpath)?;
29
30 for (idx, bank) in banks.iter().enumerate() {
31 let bank_fpath = project_dirpath.join(bank_fname_from_id(idx + 1));
32 bank.to_data_file(&bank_fpath)?;
33 }
34
35 for i in 1..=8 {
36 let arr_fpath = project_dirpath.join(arr_fname_from_id(i));
37 ArrangementFile::default().to_data_file(&arr_fpath)?;
38 }
39
40 println!("New project created: {project_dirpath:?}");
41 Ok(())
42}Sourcefn to_bytes(&self) -> Result<Vec<u8>, Box<dyn Error>>
fn to_bytes(&self) -> Result<Vec<u8>, Box<dyn Error>>
Create bytes from type
// need to create everything from scratch in this example as many bytes otherwise
use serde::{Deserialize, Serialize};
use ot_tools_io::{Decode, Encode, OctatrackFileIO};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Something {
value: u8,
}
impl Decode for Something {}
impl Encode for Something {}
impl OctatrackFileIO for Something {}
let x = Something { value: 10 };
let r = x.to_bytes();
assert!(r.is_ok());
assert_eq!(r.unwrap(), [10]);Sourcefn from_yaml_file(path: &Path) -> Result<Self, Box<dyn Error>>
fn from_yaml_file(path: &Path) -> Result<Self, Box<dyn Error>>
Read type from a YAML file at path
use ot_tools_io::{ProjectFile, OctatrackFileIO};
let project = ProjectFile::from_yaml_file(&path).unwrap();
assert_eq!(project.metadata.project_version, 19);Sourcefn from_yaml_str(yaml: &str) -> Result<Self, Box<dyn Error>>
fn from_yaml_str(yaml: &str) -> Result<Self, Box<dyn Error>>
Read type from YAML string
// need to create everything from scratch in this example
use serde::{Deserialize, Serialize};
use ot_tools_io::{Decode, Encode, OctatrackFileIO};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Something {
value: u8,
}
impl Decode for Something {}
impl Encode for Something {}
impl OctatrackFileIO for Something {}
let r = Something::from_yaml_str("value: 10\n");
assert!(r.is_ok());
assert_eq!(r.unwrap(), Something { value: 10 });Sourcefn to_yaml_file(&self, path: &Path) -> Result<(), Box<dyn Error>>
fn to_yaml_file(&self, path: &Path) -> Result<(), Box<dyn Error>>
Write type to a YAML file at path
use ot_tools_io::{OctatrackFileIO, BankFile};
let r = BankFile::default().to_yaml_file(&path);
assert!(r.is_ok());
assert!(path.exists());Sourcefn to_yaml_string(&self) -> Result<String, Box<dyn Error>>
fn to_yaml_string(&self) -> Result<String, Box<dyn Error>>
Create YAML string from type
use ot_tools_io::{BankFile, OctatrackFileIO};
let bank = BankFile::default().to_yaml_string().unwrap();
assert_eq!(bank.len(), 12578424);
assert_eq!(bank[0..15], "header:\n- 70\n- ".to_string());Sourcefn from_json_file(path: &Path) -> Result<Self, Box<dyn Error>>
fn from_json_file(path: &Path) -> Result<Self, Box<dyn Error>>
Read type from a JSON file at path
Sourcefn from_json_str(json: &str) -> Result<Self, Box<dyn Error>>
fn from_json_str(json: &str) -> Result<Self, Box<dyn Error>>
Create type from JSON string
// need to create everything from scratch in this example
use serde::{Deserialize, Serialize};
use ot_tools_io::{Decode, Encode, OctatrackFileIO};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Something {
value: u8,
}
impl Decode for Something {}
impl Encode for Something {}
impl OctatrackFileIO for Something {}
let r = Something::from_json_str("{\"value\":10}");
assert!(r.is_ok());
assert_eq!(r.unwrap(), Something { value: 10 });Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.