1- use super :: HardlinkList ;
2- use crate :: {
3- hardlink:: { LinkPathList , LinkPathListReflection } ,
4- inode:: InodeNumber ,
5- } ;
1+ use super :: { HardlinkList , Value } ;
2+ use crate :: { hardlink:: LinkPathListReflection , inode:: InodeNumber } ;
63use dashmap:: DashMap ;
74use derive_more:: { Display , Error , Into , IntoIterator } ;
85use pipe_trait:: Pipe ;
@@ -44,16 +41,38 @@ impl<Size> Reflection<Size> {
4441#[ derive( Debug , Clone , PartialEq , Eq ) ]
4542#[ cfg_attr( feature = "json" , derive( Deserialize , Serialize ) ) ]
4643pub struct ReflectionEntry < Size > {
44+ /// The inode number of the file.
4745 pub ino : InodeNumber ,
46+ /// Size of the file.
4847 pub size : Size ,
49- pub links : LinkPathListReflection ,
48+ /// Total number of links of the file, both listed (in [`Self::paths`]) and unlisted.
49+ pub links : u64 ,
50+ /// Paths to the detected links of the file.
51+ pub paths : LinkPathListReflection ,
5052}
5153
5254impl < Size > ReflectionEntry < Size > {
53- /// Create a new value.
54- fn new ( ino : InodeNumber , size : Size , links : LinkPathList ) -> Self {
55- let links = links. into ( ) ;
56- ReflectionEntry { ino, size, links }
55+ /// Create a new entry.
56+ fn new ( ino : InodeNumber , Value { size, links, paths } : Value < Size > ) -> Self {
57+ let paths = paths. into ( ) ;
58+ ReflectionEntry {
59+ ino,
60+ size,
61+ links,
62+ paths,
63+ }
64+ }
65+
66+ /// Dissolve [`ReflectionEntry`] into a pair of [`InodeNumber`] and [`Value`].
67+ fn dissolve ( self ) -> ( InodeNumber , Value < Size > ) {
68+ let ReflectionEntry {
69+ ino,
70+ size,
71+ links,
72+ paths,
73+ } = self ;
74+ let paths = paths. into ( ) ;
75+ ( ino, Value { size, links, paths } )
5776 }
5877}
5978
@@ -68,7 +87,7 @@ impl<Size> From<Vec<ReflectionEntry<Size>>> for Reflection<Size> {
6887impl < Size > From < HardlinkList < Size > > for Reflection < Size > {
6988 fn from ( HardlinkList ( list) : HardlinkList < Size > ) -> Self {
7089 list. into_iter ( )
71- . map ( |( ino, ( size , links ) ) | ReflectionEntry :: new ( ino, size , links ) )
90+ . map ( |( ino, value ) | ReflectionEntry :: new ( ino, value ) )
7291 . collect :: < Vec < _ > > ( )
7392 . pipe ( Reflection :: from)
7493 }
@@ -89,9 +108,9 @@ impl<Size> TryFrom<Reflection<Size>> for HardlinkList<Size> {
89108 fn try_from ( Reflection ( entries) : Reflection < Size > ) -> Result < Self , Self :: Error > {
90109 let map = DashMap :: with_capacity ( entries. len ( ) ) ;
91110
92- for ReflectionEntry { ino , size , links } in entries {
93- let links = links . into ( ) ;
94- if map. insert ( ino, ( size , links ) ) . is_some ( ) {
111+ for entry in entries {
112+ let ( ino , value ) = entry . dissolve ( ) ;
113+ if map. insert ( ino, value ) . is_some ( ) {
95114 return ino. pipe ( ConversionError :: DuplicatedInode ) . pipe ( Err ) ;
96115 }
97116 }
0 commit comments