1515// specific language governing permissions and limitations
1616// under the License.
1717
18+ use tokio:: sync:: OnceCell ;
19+
1820use crate :: io:: { FileRead , InputFile } ;
1921use crate :: puffin:: blob:: Blob ;
2022use crate :: puffin:: metadata:: { BlobMetadata , FileMetadata } ;
@@ -23,26 +25,23 @@ use crate::Result;
2325/// Puffin reader
2426pub ( crate ) struct PuffinReader {
2527 input_file : InputFile ,
26- file_metadata : Option < FileMetadata > ,
28+ file_metadata : OnceCell < FileMetadata > ,
2729}
2830
2931impl PuffinReader {
3032 /// Returns a new Puffin reader
3133 pub ( crate ) fn new ( input_file : InputFile ) -> Self {
3234 Self {
3335 input_file,
34- file_metadata : None ,
36+ file_metadata : OnceCell :: new ( ) ,
3537 }
3638 }
3739
3840 /// Returns file metadata
39- pub ( crate ) async fn file_metadata ( & mut self ) -> Result < & FileMetadata > {
40- if let Some ( ref file_metadata) = self . file_metadata {
41- Ok ( file_metadata)
42- } else {
43- let file_metadata = FileMetadata :: read ( & self . input_file ) . await ?;
44- Ok ( self . file_metadata . insert ( file_metadata) )
45- }
41+ pub ( crate ) async fn file_metadata ( & self ) -> Result < & FileMetadata > {
42+ self . file_metadata
43+ . get_or_try_init ( || FileMetadata :: read ( & self . input_file ) )
44+ . await
4645 }
4746
4847 /// Returns blob
@@ -77,7 +76,7 @@ mod tests {
7776 #[ tokio:: test]
7877 async fn test_puffin_reader_uncompressed_metric_data ( ) {
7978 let input_file = java_uncompressed_metric_input_file ( ) ;
80- let mut puffin_reader = PuffinReader :: new ( input_file) ;
79+ let puffin_reader = PuffinReader :: new ( input_file) ;
8180
8281 let file_metadata = puffin_reader. file_metadata ( ) . await . unwrap ( ) . clone ( ) ;
8382 assert_eq ! ( file_metadata, uncompressed_metric_file_metadata( ) ) ;
@@ -102,7 +101,7 @@ mod tests {
102101 #[ tokio:: test]
103102 async fn test_puffin_reader_zstd_compressed_metric_data ( ) {
104103 let input_file = java_zstd_compressed_metric_input_file ( ) ;
105- let mut puffin_reader = PuffinReader :: new ( input_file) ;
104+ let puffin_reader = PuffinReader :: new ( input_file) ;
106105
107106 let file_metadata = puffin_reader. file_metadata ( ) . await . unwrap ( ) . clone ( ) ;
108107 assert_eq ! ( file_metadata, zstd_compressed_metric_file_metadata( ) ) ;
0 commit comments