Skip to main content

Record

Struct Record 

Source
pub struct Record { /* private fields */ }
Expand description

One AU3 resource record.

Implementations§

Source§

impl Record

Source

pub const fn index(&self) -> usize

Returns the zero-based record index.

§Returns

The position of this record within the parsed stream.

Examples found in repository?
examples/dump.rs (line 145)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn offset(&self) -> usize

Returns the file offset where this record starts.

§Returns

The absolute byte offset of the record’s FILE marker in the input.

Examples found in repository?
examples/dump.rs (line 145)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub fn subtype(&self) -> &str

Returns the decoded subtype text.

§Returns

The record subtype as decoded text (e.g. the >>>AUTOIT SCRIPT<<< tag).

Examples found in repository?
examples/dump.rs (line 146)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub fn subtype_bytes(&self) -> &[u8]

Returns the raw decrypted subtype bytes.

§Returns

The decrypted subtype bytes prior to text decoding.

Source

pub fn name(&self) -> &str

Returns the decoded stored name/path text.

§Returns

The record’s stored name or path as decoded text.

Examples found in repository?
examples/dump.rs (line 147)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub fn name_bytes(&self) -> &[u8]

Returns the raw decrypted name/path bytes.

§Returns

The decrypted name/path bytes prior to text decoding.

Source

pub const fn compressed(&self) -> bool

Returns whether the record payload is marked compressed.

§Returns

true when the record’s compression flag is set, false otherwise.

Examples found in repository?
examples/dump.rs (line 160)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn compressed_size(&self) -> u32

Returns the stored encrypted/compressed data size.

§Returns

The byte length of the on-disk encrypted (and possibly compressed) blob.

Examples found in repository?
examples/dump.rs (line 161)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn uncompressed_size(&self) -> u32

Returns the advertised uncompressed data size.

§Returns

The uncompressed byte length declared in the record header.

Examples found in repository?
examples/dump.rs (line 162)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn checksum(&self) -> u32

Returns the stored checksum value.

For EA04/JB01 records, which carry no checksum field, this is 0.

§Returns

The stored adler32 checksum (EA05/EA06), or 0 when absent (EA04/JB01).

Examples found in repository?
examples/dump.rs (line 169)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn checksum_valid(&self) -> bool

Returns whether the stored checksum matches the decrypted record data.

EA04/JB01 records carry no checksum, so they are treated as validated and this returns true.

§Returns

true when the adler32 of the decrypted data matches the stored checksum, or when no checksum is present (EA04/JB01); false on mismatch.

Examples found in repository?
examples/dump.rs (line 170)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn creation_time(&self) -> u64

Returns the creation timestamp as a raw Windows FILETIME.

§Returns

The record’s creation time as a 64-bit Windows FILETIME value.

Examples found in repository?
examples/dump.rs (line 181)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn last_write_time(&self) -> u64

Returns the last-write timestamp as a raw Windows FILETIME.

§Returns

The record’s last-write time as a 64-bit Windows FILETIME value.

Examples found in repository?
examples/dump.rs (line 182)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub fn encrypted_data(&self) -> &[u8]

Returns the encrypted record data bytes as stored on disk.

§Returns

The raw encrypted (and possibly compressed) payload bytes.

Examples found in repository?
examples/dump.rs (line 189)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub fn decrypted_data(&self) -> &[u8]

Returns the decrypted record data bytes.

These are still in their compressed (wrapped) form when the record is marked compressed.

§Returns

The decrypted payload bytes, prior to any decompression.

Examples found in repository?
examples/dump.rs (line 190)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub fn decompressed_data(&self) -> Option<&[u8]>

Returns the decompressed record data bytes when decompression succeeded.

§Returns

Some with the decompressed bytes when the record was compressed and decompression succeeded, or None when the record was not compressed or decompression failed.

Examples found in repository?
examples/dump.rs (line 192)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub fn payload_data(&self) -> &[u8]

Returns the best available payload bytes.

This is decompressed data when present, otherwise decrypted record data.

§Returns

The decompressed bytes when available, otherwise the decrypted bytes.

Examples found in repository?
examples/dump.rs (line 194)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn decompression_status(&self) -> DecompressionStatus

Returns the decompression status for this record.

§Returns

A DecompressionStatus describing whether the record was compressed and, if so, whether decompression succeeded.

Examples found in repository?
examples/dump.rs (line 199)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}
Source

pub const fn profile(&self) -> RecordProfile

Returns the extraction profile facts for this record.

§Returns

A RecordProfile describing the encoding, encryption stream, and compression wrapper observed for the record.

Examples found in repository?
examples/dump.rs (line 148)
142fn print_records(records: &[Record]) {
143    section(&format!("records ({})", records.len()));
144    for record in records {
145        println!("  #{} @ offset {}", record.index(), record.offset());
146        subfield("subtype", escape_inline(record.subtype()));
147        subfield("name", escape_inline(record.name()));
148        let profile = record.profile();
149        subfield(
150            "profile",
151            format!(
152                "encoding={:?} encryption={:?} compression={:?}",
153                profile.encoding, profile.encryption, profile.compression
154            ),
155        );
156        subfield(
157            "compressed",
158            format!(
159                "{} (compressed_size={}, uncompressed_size={})",
160                record.compressed(),
161                record.compressed_size(),
162                record.uncompressed_size()
163            ),
164        );
165        subfield(
166            "checksum",
167            format!(
168                "{:#010x} ({})",
169                record.checksum(),
170                if record.checksum_valid() {
171                    "valid"
172                } else {
173                    "invalid"
174                }
175            ),
176        );
177        subfield(
178            "timestamps",
179            format!(
180                "created={} last_write={}",
181                record.creation_time(),
182                record.last_write_time()
183            ),
184        );
185        subfield(
186            "data sizes",
187            format!(
188                "encrypted={} decrypted={} decompressed={} payload={}",
189                record.encrypted_data().len(),
190                record.decrypted_data().len(),
191                record
192                    .decompressed_data()
193                    .map_or_else(|| "none".to_string(), |data| data.len().to_string()),
194                record.payload_data().len()
195            ),
196        );
197        subfield(
198            "decompression",
199            format!("{:?}", record.decompression_status()),
200        );
201    }
202}

Trait Implementations§

Source§

impl Clone for Record

Source§

fn clone(&self) -> Record

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Record

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for Record

Source§

impl PartialEq for Record

Source§

fn eq(&self, other: &Record) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Record

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.