@@ -91,6 +91,36 @@ impl ChecksumType {
9191 }
9292}
9393
94+ /// A typed digest in a release file.
95+ #[ derive( Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
96+ pub enum ReleaseFileDigest < ' a > {
97+ Md5 ( & ' a str ) ,
98+ Sha1 ( & ' a str ) ,
99+ Sha256 ( & ' a str ) ,
100+ }
101+
102+ impl < ' a > ReleaseFileDigest < ' a > {
103+ /// Create a new instance given the checksum type and a digest value.
104+ pub fn new ( checksum : ChecksumType , value : & ' a str ) -> Self {
105+ match checksum {
106+ ChecksumType :: Md5 => Self :: Md5 ( value) ,
107+ ChecksumType :: Sha1 => Self :: Sha1 ( value) ,
108+ ChecksumType :: Sha256 => Self :: Sha256 ( value) ,
109+ }
110+ }
111+
112+ /// The name of the `Release` paragraph field from which this digest came.
113+ ///
114+ /// Is also the `by-hash` path component.
115+ pub fn field_name ( & self ) -> & ' static str {
116+ match self {
117+ Self :: Md5 ( _) => ChecksumType :: Md5 . field_name ( ) ,
118+ Self :: Sha1 ( _) => ChecksumType :: Sha1 . field_name ( ) ,
119+ Self :: Sha256 ( _) => ChecksumType :: Sha256 . field_name ( ) ,
120+ }
121+ }
122+ }
123+
94124/// An entry for a file in a parsed `Release` file.
95125///
96126/// Instances correspond to a line in a `MD5Sum`, `SHA1`, or `SHA256` field.
@@ -100,7 +130,7 @@ pub struct ReleaseFileEntry<'a> {
100130 pub path : & ' a str ,
101131
102132 /// The hex digest of this file.
103- pub digest : & ' a str ,
133+ pub digest : ReleaseFileDigest < ' a > ,
104134
105135 /// The size of the file in bytes.
106136 pub size : usize ,
@@ -411,7 +441,7 @@ impl<'a> ReleaseFile<'a> {
411441 . paragraph
412442 . first_field_iter_values ( checksum. field_name ( ) )
413443 {
414- Some ( Box :: new ( iter. map ( |v| {
444+ Some ( Box :: new ( iter. map ( move |v| {
415445 // Values are of form: <digest> <size> <path>
416446
417447 let mut parts = v. split_ascii_whitespace ( ) ;
@@ -425,6 +455,7 @@ impl<'a> ReleaseFile<'a> {
425455 return Err ( ReleaseError :: PathWithSpaces ( v. to_string ( ) ) ) ;
426456 }
427457
458+ let digest = ReleaseFileDigest :: new ( checksum, digest) ;
428459 let size = usize:: from_str ( size) ?;
429460
430461 Ok ( ReleaseFileEntry { path, digest, size } )
@@ -573,23 +604,23 @@ mod test {
573604 entries[ 0 ] ,
574605 ReleaseFileEntry {
575606 path: "contrib/Contents-all" ,
576- digest: "7fdf4db15250af5368cc52a91e8edbce" ,
607+ digest: ReleaseFileDigest :: Md5 ( "7fdf4db15250af5368cc52a91e8edbce" ) ,
577608 size: 738242 ,
578609 }
579610 ) ;
580611 assert_eq ! (
581612 entries[ 1 ] ,
582613 ReleaseFileEntry {
583614 path: "contrib/Contents-all.gz" ,
584- digest: "cbd7bc4d3eb517ac2b22f929dfc07b47" ,
615+ digest: ReleaseFileDigest :: Md5 ( "cbd7bc4d3eb517ac2b22f929dfc07b47" ) ,
585616 size: 57319 ,
586617 }
587618 ) ;
588619 assert_eq ! (
589620 entries[ 599 ] ,
590621 ReleaseFileEntry {
591622 path: "non-free/source/Sources.xz" ,
592- digest: "e3830f6fc5a946b5a5b46e8277e1d86f" ,
623+ digest: ReleaseFileDigest :: Md5 ( "e3830f6fc5a946b5a5b46e8277e1d86f" ) ,
593624 size: 80488 ,
594625 }
595626 ) ;
@@ -605,22 +636,28 @@ mod test {
605636 entries[ 0 ] ,
606637 ReleaseFileEntry {
607638 path: "contrib/Contents-all" ,
608- digest: "3957f28db16e3f28c7b34ae84f1c929c567de6970f3f1b95dac9b498dd80fe63" ,
639+ digest: ReleaseFileDigest :: Sha256 (
640+ "3957f28db16e3f28c7b34ae84f1c929c567de6970f3f1b95dac9b498dd80fe63"
641+ ) ,
609642 size: 738242 ,
610643 }
611644 ) ;
612645 assert_eq ! (
613646 entries[ 1 ] ,
614647 ReleaseFileEntry {
615648 path: "contrib/Contents-all.gz" ,
616- digest: "3e9a121d599b56c08bc8f144e4830807c77c29d7114316d6984ba54695d3db7b" ,
649+ digest: ReleaseFileDigest :: Sha256 (
650+ "3e9a121d599b56c08bc8f144e4830807c77c29d7114316d6984ba54695d3db7b"
651+ ) ,
617652 size: 57319 ,
618653 }
619654 ) ;
620655 assert_eq ! (
621656 entries[ 599 ] ,
622657 ReleaseFileEntry {
623- digest: "30f3f996941badb983141e3b29b2ed5941d28cf81f9b5f600bb48f782d386fc7" ,
658+ digest: ReleaseFileDigest :: Sha256 (
659+ "30f3f996941badb983141e3b29b2ed5941d28cf81f9b5f600bb48f782d386fc7"
660+ ) ,
624661 size: 80488 ,
625662 path: "non-free/source/Sources.xz" ,
626663 }
@@ -637,7 +674,9 @@ mod test {
637674 ContentsFileEntry {
638675 entry: ReleaseFileEntry {
639676 path: "contrib/Contents-all" ,
640- digest: "3957f28db16e3f28c7b34ae84f1c929c567de6970f3f1b95dac9b498dd80fe63" ,
677+ digest: ReleaseFileDigest :: Sha256 (
678+ "3957f28db16e3f28c7b34ae84f1c929c567de6970f3f1b95dac9b498dd80fe63"
679+ ) ,
641680 size: 738242 ,
642681 } ,
643682 component: "contrib" . into( ) ,
@@ -651,7 +690,9 @@ mod test {
651690 ContentsFileEntry {
652691 entry: ReleaseFileEntry {
653692 path: "contrib/Contents-all.gz" ,
654- digest: "3e9a121d599b56c08bc8f144e4830807c77c29d7114316d6984ba54695d3db7b" ,
693+ digest: ReleaseFileDigest :: Sha256 (
694+ "3e9a121d599b56c08bc8f144e4830807c77c29d7114316d6984ba54695d3db7b"
695+ ) ,
655696 size: 57319 ,
656697 } ,
657698 component: "contrib" . into( ) ,
@@ -665,7 +706,9 @@ mod test {
665706 ContentsFileEntry {
666707 entry: ReleaseFileEntry {
667708 path: "contrib/Contents-udeb-amd64" ,
668- digest: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ,
709+ digest: ReleaseFileDigest :: Sha256 (
710+ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
711+ ) ,
669712 size: 0 ,
670713 } ,
671714 component: "contrib" . into( ) ,
@@ -686,7 +729,9 @@ mod test {
686729 PackagesFileEntry {
687730 entry: ReleaseFileEntry {
688731 path: "contrib/binary-all/Packages" ,
689- digest: "48cfe101cd84f16baf720b99e8f2ff89fd7e063553966d8536b472677acb82f0" ,
732+ digest: ReleaseFileDigest :: Sha256 (
733+ "48cfe101cd84f16baf720b99e8f2ff89fd7e063553966d8536b472677acb82f0"
734+ ) ,
690735 size: 103223 ,
691736 } ,
692737 component: "contrib" . into( ) ,
@@ -700,7 +745,9 @@ mod test {
700745 PackagesFileEntry {
701746 entry: ReleaseFileEntry {
702747 path: "contrib/binary-all/Packages.gz" ,
703- digest: "86057fcd3eff667ec8e3fbabb2a75e229f5e99f39ace67ff0db4a8509d0707e4" ,
748+ digest: ReleaseFileDigest :: Sha256 (
749+ "86057fcd3eff667ec8e3fbabb2a75e229f5e99f39ace67ff0db4a8509d0707e4"
750+ ) ,
704751 size: 27334 ,
705752 } ,
706753 component: "contrib" . into( ) ,
@@ -714,7 +761,9 @@ mod test {
714761 PackagesFileEntry {
715762 entry: ReleaseFileEntry {
716763 path: "contrib/binary-all/Packages.xz" ,
717- digest: "706c840235798e098d4d6013d1dabbc967f894d0ffa02c92ac959dcea85ddf54" ,
764+ digest: ReleaseFileDigest :: Sha256 (
765+ "706c840235798e098d4d6013d1dabbc967f894d0ffa02c92ac959dcea85ddf54"
766+ ) ,
718767 size: 23912 ,
719768 } ,
720769 component: "contrib" . into( ) ,
@@ -735,7 +784,9 @@ mod test {
735784 PackagesFileEntry {
736785 entry: ReleaseFileEntry {
737786 path: "contrib/debian-installer/binary-all/Packages" ,
738- digest: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ,
787+ digest: ReleaseFileDigest :: Sha256 (
788+ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
789+ ) ,
739790 size: 0 ,
740791 } ,
741792 component: "contrib" . into( ) ,
0 commit comments