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,25 @@ 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 
3133pub ( crate )  fn  new ( input_file :  InputFile )  -> Self  { 
34+         let  file_metadata = OnceCell :: const_new ( ) ; 
35+ 
3236        Self  { 
3337            input_file, 
34-             file_metadata :   None , 
38+             file_metadata, 
3539        } 
3640    } 
3741
3842    /// 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-         } 
43+ pub ( crate )  async  fn  file_metadata ( & self )  -> Result < & FileMetadata >  { 
44+         self . file_metadata 
45+             . get_or_try_init ( || FileMetadata :: read ( & self . input_file ) ) 
46+             . await 
4647    } 
4748
4849    /// Returns blob 
@@ -77,7 +78,7 @@ mod tests {
7778    #[ tokio:: test]  
7879    async  fn  test_puffin_reader_uncompressed_metric_data ( )  { 
7980        let  input_file = java_uncompressed_metric_input_file ( ) ; 
80-         let  mut   puffin_reader = PuffinReader :: new ( input_file) ; 
81+         let  puffin_reader = PuffinReader :: new ( input_file) ; 
8182
8283        let  file_metadata = puffin_reader. file_metadata ( ) . await . unwrap ( ) . clone ( ) ; 
8384        assert_eq ! ( file_metadata,  uncompressed_metric_file_metadata( ) ) ; 
@@ -102,7 +103,7 @@ mod tests {
102103    #[ tokio:: test]  
103104    async  fn  test_puffin_reader_zstd_compressed_metric_data ( )  { 
104105        let  input_file = java_zstd_compressed_metric_input_file ( ) ; 
105-         let  mut   puffin_reader = PuffinReader :: new ( input_file) ; 
106+         let  puffin_reader = PuffinReader :: new ( input_file) ; 
106107
107108        let  file_metadata = puffin_reader. file_metadata ( ) . await . unwrap ( ) . clone ( ) ; 
108109        assert_eq ! ( file_metadata,  zstd_compressed_metric_file_metadata( ) ) ; 
0 commit comments