Thomas 9 kuukautta sitten
vanhempi
commit
f711af1838
6 muutettua tiedostoa jossa 750 lisäystä ja 138 poistoa
  1. 70 134
      Cargo.lock
  2. 2 2
      Cargo.toml
  3. 1 0
      src/io/mod.rs
  4. 668 0
      src/io/pod5_footer_generated.rs
  5. 7 1
      src/io/pod5_infos.rs
  6. 2 1
      src/lib.rs

+ 70 - 134
Cargo.lock

@@ -157,11 +157,10 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
 
 [[package]]
 name = "arrow"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bc25126d18a012146a888a0298f2c22e1150327bd2765fc76d710a556b2d614"
+checksum = "755b6da235ac356a869393c23668c663720b8749dd6f15e52b6c214b4b964cc7"
 dependencies = [
- "ahash 0.8.11",
  "arrow-arith",
  "arrow-array",
  "arrow-buffer",
@@ -179,24 +178,23 @@ dependencies = [
 
 [[package]]
 name = "arrow-arith"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34ccd45e217ffa6e53bbb0080990e77113bdd4e91ddb84e97b77649810bcf1a7"
+checksum = "64656a1e0b13ca766f8440752e9a93e11014eec7b67909986f83ed0ab1fe37b8"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
  "arrow-data",
  "arrow-schema",
  "chrono",
- "half",
  "num",
 ]
 
 [[package]]
 name = "arrow-array"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bda9acea48b25123c08340f3a8ac361aa0f74469bb36f5ee9acf923fce23e9d"
+checksum = "57a4a6d2896083cfbdf84a71a863b22460d0708f8206a8373c52e326cc72ea1a"
 dependencies = [
  "ahash 0.8.11",
  "arrow-buffer",
@@ -204,15 +202,15 @@ dependencies = [
  "arrow-schema",
  "chrono",
  "half",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "num",
 ]
 
 [[package]]
 name = "arrow-buffer"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01a0fc21915b00fc6c2667b069c1b64bdd920982f426079bc4a7cab86822886c"
+checksum = "cef870583ce5e4f3b123c181706f2002fb134960f9a911900f64ba4830c7a43a"
 dependencies = [
  "bytes",
  "half",
@@ -221,46 +219,45 @@ dependencies = [
 
 [[package]]
 name = "arrow-cast"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5dc0368ed618d509636c1e3cc20db1281148190a78f43519487b2daf07b63b4a"
+checksum = "1ac7eba5a987f8b4a7d9629206ba48e19a1991762795bbe5d08497b7736017ee"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
  "arrow-data",
  "arrow-schema",
  "arrow-select",
- "base64 0.21.7",
+ "atoi",
+ "base64 0.22.1",
  "chrono",
  "half",
- "lexical-core 0.8.5",
+ "lexical-core",
  "num",
+ "ryu",
 ]
 
 [[package]]
 name = "arrow-csv"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e09aa6246a1d6459b3f14baeaa49606cfdbca34435c46320e14054d244987ca"
+checksum = "90f12542b8164398fc9ec595ff783c4cf6044daa89622c5a7201be920e4c0d4c"
 dependencies = [
  "arrow-array",
- "arrow-buffer",
  "arrow-cast",
- "arrow-data",
  "arrow-schema",
  "chrono",
  "csv",
  "csv-core",
  "lazy_static",
- "lexical-core 0.8.5",
  "regex",
 ]
 
 [[package]]
 name = "arrow-data"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "907fafe280a3874474678c1858b9ca4cb7fd83fb8034ff5b6d6376205a08c634"
+checksum = "b095e8a4f3c309544935d53e04c3bfe4eea4e71c3de6fe0416d1f08bb4441a83"
 dependencies = [
  "arrow-buffer",
  "arrow-schema",
@@ -270,23 +267,22 @@ dependencies = [
 
 [[package]]
 name = "arrow-ipc"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79a43d6808411886b8c7d4f6f7dd477029c1e77ffffffb7923555cc6579639cd"
+checksum = "65c63da4afedde2b25ef69825cd4663ca76f78f79ffe2d057695742099130ff6"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
- "arrow-cast",
  "arrow-data",
  "arrow-schema",
- "flatbuffers",
+ "flatbuffers 24.12.23",
 ]
 
 [[package]]
 name = "arrow-json"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d82565c91fd627922ebfe2810ee4e8346841b6f9361b87505a9acea38b614fee"
+checksum = "9551d9400532f23a370cabbea1dc5a53c49230397d41f96c4c8eedf306199305"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
@@ -296,7 +292,7 @@ dependencies = [
  "chrono",
  "half",
  "indexmap",
- "lexical-core 0.8.5",
+ "lexical-core",
  "num",
  "serde",
  "serde_json",
@@ -304,45 +300,41 @@ dependencies = [
 
 [[package]]
 name = "arrow-ord"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b23b0e53c0db57c6749997fd343d4c0354c994be7eca67152dd2bdb9a3e1bb4"
+checksum = "6c07223476f8219d1ace8cd8d85fa18c4ebd8d945013f25ef5c72e85085ca4ee"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
  "arrow-data",
  "arrow-schema",
  "arrow-select",
- "half",
- "num",
 ]
 
 [[package]]
 name = "arrow-row"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "361249898d2d6d4a6eeb7484be6ac74977e48da12a4dd81a708d620cc558117a"
+checksum = "91b194b38bfd89feabc23e798238989c6648b2506ad639be42ec8eb1658d82c4"
 dependencies = [
- "ahash 0.8.11",
  "arrow-array",
  "arrow-buffer",
  "arrow-data",
  "arrow-schema",
  "half",
- "hashbrown 0.14.5",
 ]
 
 [[package]]
 name = "arrow-schema"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09e28a5e781bf1b0f981333684ad13f5901f4cd2f20589eab7cf1797da8fc167"
+checksum = "0f40f6be8f78af1ab610db7d9b236e21d587b7168e368a36275d2e5670096735"
 
 [[package]]
 name = "arrow-select"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f6208466590960efc1d2a7172bc4ff18a67d6e25c529381d7f96ddaf0dc4036"
+checksum = "ac265273864a820c4a179fc67182ccc41ea9151b97024e1be956f0f2369c2539"
 dependencies = [
  "ahash 0.8.11",
  "arrow-array",
@@ -354,20 +346,30 @@ dependencies = [
 
 [[package]]
 name = "arrow-string"
-version = "49.0.0"
+version = "54.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a48149c63c11c9ff571e50ab8f017d2a7cb71037a882b42f6354ed2da9acc7"
+checksum = "d44c8eed43be4ead49128370f7131f054839d3d6003e52aebf64322470b8fbd0"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
  "arrow-data",
  "arrow-schema",
  "arrow-select",
+ "memchr",
  "num",
  "regex",
  "regex-syntax",
 ]
 
+[[package]]
+name = "atoi"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
+dependencies = [
+ "num-traits",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -1562,14 +1564,24 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
 
 [[package]]
 name = "flatbuffers"
-version = "23.5.26"
+version = "24.12.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dac53e22462d78c16d64a1cd22371b54cc3fe94aa15e7886a2fa6e5d1ab8640"
+checksum = "4f1baf0dbf96932ec9a3038d57900329c015b0bfb7b63d904f3bc27e2b02a096"
 dependencies = [
  "bitflags 1.3.2",
  "rustc_version 0.4.1",
 ]
 
+[[package]]
+name = "flatbuffers"
+version = "25.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1045398c1bfd89168b5fd3f1fc11f6e70b34f6f66300c87d44d3de849463abf1"
+dependencies = [
+ "bitflags 2.8.0",
+ "rustc_version 0.4.1",
+]
+
 [[package]]
 name = "flate2"
 version = "1.1.0"
@@ -2431,41 +2443,17 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
 
-[[package]]
-name = "lexical-core"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46"
-dependencies = [
- "lexical-parse-float 0.8.5",
- "lexical-parse-integer 0.8.6",
- "lexical-util 0.8.5",
- "lexical-write-float 0.8.5",
- "lexical-write-integer 0.8.5",
-]
-
 [[package]]
 name = "lexical-core"
 version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958"
 dependencies = [
- "lexical-parse-float 1.0.5",
- "lexical-parse-integer 1.0.5",
- "lexical-util 1.0.6",
- "lexical-write-float 1.0.5",
- "lexical-write-integer 1.0.5",
-]
-
-[[package]]
-name = "lexical-parse-float"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f"
-dependencies = [
- "lexical-parse-integer 0.8.6",
- "lexical-util 0.8.5",
- "static_assertions",
+ "lexical-parse-float",
+ "lexical-parse-integer",
+ "lexical-util",
+ "lexical-write-float",
+ "lexical-write-integer",
 ]
 
 [[package]]
@@ -2474,18 +2462,8 @@ version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2"
 dependencies = [
- "lexical-parse-integer 1.0.5",
- "lexical-util 1.0.6",
- "static_assertions",
-]
-
-[[package]]
-name = "lexical-parse-integer"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9"
-dependencies = [
- "lexical-util 0.8.5",
+ "lexical-parse-integer",
+ "lexical-util",
  "static_assertions",
 ]
 
@@ -2495,16 +2473,7 @@ version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e"
 dependencies = [
- "lexical-util 1.0.6",
- "static_assertions",
-]
-
-[[package]]
-name = "lexical-util"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc"
-dependencies = [
+ "lexical-util",
  "static_assertions",
 ]
 
@@ -2517,35 +2486,14 @@ dependencies = [
  "static_assertions",
 ]
 
-[[package]]
-name = "lexical-write-float"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862"
-dependencies = [
- "lexical-util 0.8.5",
- "lexical-write-integer 0.8.5",
- "static_assertions",
-]
-
 [[package]]
 name = "lexical-write-float"
 version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd"
 dependencies = [
- "lexical-util 1.0.6",
- "lexical-write-integer 1.0.5",
- "static_assertions",
-]
-
-[[package]]
-name = "lexical-write-integer"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446"
-dependencies = [
- "lexical-util 0.8.5",
+ "lexical-util",
+ "lexical-write-integer",
  "static_assertions",
 ]
 
@@ -2555,7 +2503,7 @@ version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978"
 dependencies = [
- "lexical-util 1.0.6",
+ "lexical-util",
  "static_assertions",
 ]
 
@@ -2959,7 +2907,7 @@ dependencies = [
  "bitflags 2.8.0",
  "bstr",
  "indexmap",
- "lexical-core 1.0.5",
+ "lexical-core",
  "memchr",
  "noodles-bgzf 0.34.0",
  "noodles-core 0.15.0",
@@ -3278,6 +3226,7 @@ dependencies = [
  "dirs",
  "duct",
  "env_logger",
+ "flatbuffers 25.2.10",
  "glob",
  "hashbrown 0.15.2",
  "indicatif",
@@ -3292,7 +3241,6 @@ dependencies = [
  "pandora_lib_assembler",
  "pandora_lib_scan",
  "pandora_lib_variants",
- "podders",
  "rand 0.9.0",
  "rayon",
  "rusqlite",
@@ -3591,18 +3539,6 @@ dependencies = [
  "miniz_oxide 0.8.5",
 ]
 
-[[package]]
-name = "podders"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cc67713396eed3e7de3deca3ca3fd4d8197e73d48e5323317e870ac62ccf9ad"
-dependencies = [
- "arrow",
- "flatbuffers",
- "log",
- "uuid",
-]
-
 [[package]]
 name = "portable-atomic"
 version = "1.11.0"

+ 2 - 2
Cargo.toml

@@ -27,8 +27,7 @@ ctrlc = "3.4.4"
 lazy_static = "1.5.0"
 indicatif = "0.17.8"
 rust-htslib = "0.49.0"
-podders = "0.1.4"
-arrow = "49.0.0"
+arrow = "54.2.0"
 bgzip = "0.3.1"
 tempfile = "3.14.0"
 dashmap = { version = "6.1.0", features = ["rayon", "serde"] }
@@ -41,6 +40,7 @@ noodles-gff = "0.43.0"
 itertools = "0.14.0"
 rand = "0.9.0"
 tar = "0.4.43"
+flatbuffers = "25.2.10"
 
 [profile.dev]
 opt-level = 0

+ 1 - 0
src/io/mod.rs

@@ -4,3 +4,4 @@ pub mod vcf;
 pub mod bed;
 pub mod dict;
 pub mod fasta;
+pub mod pod5_footer_generated;

+ 668 - 0
src/io/pod5_footer_generated.rs

@@ -0,0 +1,668 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+// @generated
+// From podders crate
+
+#[allow(unused_imports, dead_code)]
+pub mod minknow {
+
+    use core::cmp::Ordering;
+    use core::mem;
+
+    use flatbuffers::{EndianScalar, Follow};
+    #[allow(unused_imports, dead_code)]
+    pub mod reads_format {
+
+        use core::cmp::Ordering;
+        use core::mem;
+
+        use flatbuffers::{EndianScalar, Follow};
+
+        #[deprecated(
+            since = "2.0.0",
+            note = "Use associated constants instead. This will no longer be generated in 2021."
+        )]
+        pub const ENUM_MIN_CONTENT_TYPE: i16 = 0;
+        #[deprecated(
+            since = "2.0.0",
+            note = "Use associated constants instead. This will no longer be generated in 2021."
+        )]
+        pub const ENUM_MAX_CONTENT_TYPE: i16 = 4;
+        #[deprecated(
+            since = "2.0.0",
+            note = "Use associated constants instead. This will no longer be generated in 2021."
+        )]
+        #[allow(non_camel_case_types)]
+        pub const ENUM_VALUES_CONTENT_TYPE: [ContentType; 5] = [
+            ContentType::ReadsTable,
+            ContentType::SignalTable,
+            ContentType::ReadIdIndex,
+            ContentType::OtherIndex,
+            ContentType::RunInfoTable,
+        ];
+
+        #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
+        #[repr(transparent)]
+        pub struct ContentType(pub i16);
+        #[allow(non_upper_case_globals)]
+        impl ContentType {
+            pub const ReadsTable: Self = Self(0);
+            pub const SignalTable: Self = Self(1);
+            pub const ReadIdIndex: Self = Self(2);
+            pub const OtherIndex: Self = Self(3);
+            pub const RunInfoTable: Self = Self(4);
+
+            pub const ENUM_MIN: i16 = 0;
+            pub const ENUM_MAX: i16 = 4;
+            pub const ENUM_VALUES: &'static [Self] = &[
+                Self::ReadsTable,
+                Self::SignalTable,
+                Self::ReadIdIndex,
+                Self::OtherIndex,
+                Self::RunInfoTable,
+            ];
+            /// Returns the variant's name or "" if unknown.
+            pub fn variant_name(self) -> Option<&'static str> {
+                match self {
+                    Self::ReadsTable => Some("ReadsTable"),
+                    Self::SignalTable => Some("SignalTable"),
+                    Self::ReadIdIndex => Some("ReadIdIndex"),
+                    Self::OtherIndex => Some("OtherIndex"),
+                    Self::RunInfoTable => Some("RunInfoTable"),
+                    _ => None,
+                }
+            }
+        }
+        impl core::fmt::Debug for ContentType {
+            fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
+                if let Some(name) = self.variant_name() {
+                    f.write_str(name)
+                } else {
+                    f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+                }
+            }
+        }
+        impl<'a> flatbuffers::Follow<'a> for ContentType {
+            type Inner = Self;
+            #[inline]
+            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+                let b = flatbuffers::read_scalar_at::<i16>(buf, loc);
+                Self(b)
+            }
+        }
+
+        impl flatbuffers::Push for ContentType {
+            type Output = ContentType;
+            #[inline]
+            unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {
+                flatbuffers::emplace_scalar::<i16>(dst, self.0);
+            }
+        }
+
+        impl flatbuffers::EndianScalar for ContentType {
+            type Scalar = i16;
+            #[inline]
+            fn to_little_endian(self) -> i16 {
+                self.0.to_le()
+            }
+            #[inline]
+            #[allow(clippy::wrong_self_convention)]
+            fn from_little_endian(v: i16) -> Self {
+                let b = i16::from_le(v);
+                Self(b)
+            }
+        }
+
+        impl<'a> flatbuffers::Verifiable for ContentType {
+            #[inline]
+            fn run_verifier(
+                v: &mut flatbuffers::Verifier,
+                pos: usize,
+            ) -> Result<(), flatbuffers::InvalidFlatbuffer> {
+                use flatbuffers::Verifiable;
+                i16::run_verifier(v, pos)
+            }
+        }
+
+        impl flatbuffers::SimpleToVerifyInSlice for ContentType {}
+        #[deprecated(
+            since = "2.0.0",
+            note = "Use associated constants instead. This will no longer be generated in 2021."
+        )]
+        pub const ENUM_MIN_FORMAT: i16 = 0;
+        #[deprecated(
+            since = "2.0.0",
+            note = "Use associated constants instead. This will no longer be generated in 2021."
+        )]
+        pub const ENUM_MAX_FORMAT: i16 = 0;
+        #[deprecated(
+            since = "2.0.0",
+            note = "Use associated constants instead. This will no longer be generated in 2021."
+        )]
+        #[allow(non_camel_case_types)]
+        pub const ENUM_VALUES_FORMAT: [Format; 1] = [Format::FeatherV2];
+
+        #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
+        #[repr(transparent)]
+        pub struct Format(pub i16);
+        #[allow(non_upper_case_globals)]
+        impl Format {
+            pub const FeatherV2: Self = Self(0);
+
+            pub const ENUM_MIN: i16 = 0;
+            pub const ENUM_MAX: i16 = 0;
+            pub const ENUM_VALUES: &'static [Self] = &[Self::FeatherV2];
+            /// Returns the variant's name or "" if unknown.
+            pub fn variant_name(self) -> Option<&'static str> {
+                match self {
+                    Self::FeatherV2 => Some("FeatherV2"),
+                    _ => None,
+                }
+            }
+        }
+        impl core::fmt::Debug for Format {
+            fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
+                if let Some(name) = self.variant_name() {
+                    f.write_str(name)
+                } else {
+                    f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+                }
+            }
+        }
+        impl<'a> flatbuffers::Follow<'a> for Format {
+            type Inner = Self;
+            #[inline]
+            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+                let b = flatbuffers::read_scalar_at::<i16>(buf, loc);
+                Self(b)
+            }
+        }
+
+        impl flatbuffers::Push for Format {
+            type Output = Format;
+            #[inline]
+            unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {
+                flatbuffers::emplace_scalar::<i16>(dst, self.0);
+            }
+        }
+
+        impl flatbuffers::EndianScalar for Format {
+            type Scalar = i16;
+            #[inline]
+            fn to_little_endian(self) -> i16 {
+                self.0.to_le()
+            }
+            #[inline]
+            #[allow(clippy::wrong_self_convention)]
+            fn from_little_endian(v: i16) -> Self {
+                let b = i16::from_le(v);
+                Self(b)
+            }
+        }
+
+        impl<'a> flatbuffers::Verifiable for Format {
+            #[inline]
+            fn run_verifier(
+                v: &mut flatbuffers::Verifier,
+                pos: usize,
+            ) -> Result<(), flatbuffers::InvalidFlatbuffer> {
+                use flatbuffers::Verifiable;
+                i16::run_verifier(v, pos)
+            }
+        }
+
+        impl flatbuffers::SimpleToVerifyInSlice for Format {}
+        pub enum EmbeddedFileOffset {}
+        #[derive(Copy, Clone, PartialEq)]
+
+        pub struct EmbeddedFile<'a> {
+            pub _tab: flatbuffers::Table<'a>,
+        }
+
+        impl<'a> flatbuffers::Follow<'a> for EmbeddedFile<'a> {
+            type Inner = EmbeddedFile<'a>;
+            #[inline]
+            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+                Self {
+                    _tab: flatbuffers::Table::new(buf, loc),
+                }
+            }
+        }
+
+        impl<'a> EmbeddedFile<'a> {
+            pub const VT_OFFSET: flatbuffers::VOffsetT = 4;
+            pub const VT_LENGTH: flatbuffers::VOffsetT = 6;
+            pub const VT_FORMAT: flatbuffers::VOffsetT = 8;
+            pub const VT_CONTENT_TYPE: flatbuffers::VOffsetT = 10;
+
+            #[inline]
+            pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+                EmbeddedFile { _tab: table }
+            }
+            #[allow(unused_mut)]
+            pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(
+                _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>,
+                args: &'args EmbeddedFileArgs,
+            ) -> flatbuffers::WIPOffset<EmbeddedFile<'bldr>> {
+                let mut builder = EmbeddedFileBuilder::new(_fbb);
+                builder.add_length(args.length);
+                builder.add_offset(args.offset);
+                builder.add_content_type(args.content_type);
+                builder.add_format(args.format);
+                builder.finish()
+            }
+
+            #[inline]
+            pub fn offset(&self) -> i64 {
+                // Safety:
+                // Created from valid Table for this object
+                // which contains a valid value in this slot
+                unsafe {
+                    self._tab
+                        .get::<i64>(EmbeddedFile::VT_OFFSET, Some(0))
+                        .unwrap()
+                }
+            }
+            #[inline]
+            pub fn length(&self) -> i64 {
+                // Safety:
+                // Created from valid Table for this object
+                // which contains a valid value in this slot
+                unsafe {
+                    self._tab
+                        .get::<i64>(EmbeddedFile::VT_LENGTH, Some(0))
+                        .unwrap()
+                }
+            }
+            #[inline]
+            pub fn format(&self) -> Format {
+                // Safety:
+                // Created from valid Table for this object
+                // which contains a valid value in this slot
+                unsafe {
+                    self._tab
+                        .get::<Format>(EmbeddedFile::VT_FORMAT, Some(Format::FeatherV2))
+                        .unwrap()
+                }
+            }
+            #[inline]
+            pub fn content_type(&self) -> ContentType {
+                // Safety:
+                // Created from valid Table for this object
+                // which contains a valid value in this slot
+                unsafe {
+                    self._tab
+                        .get::<ContentType>(
+                            EmbeddedFile::VT_CONTENT_TYPE,
+                            Some(ContentType::ReadsTable),
+                        )
+                        .unwrap()
+                }
+            }
+        }
+
+        impl flatbuffers::Verifiable for EmbeddedFile<'_> {
+            #[inline]
+            fn run_verifier(
+                v: &mut flatbuffers::Verifier,
+                pos: usize,
+            ) -> Result<(), flatbuffers::InvalidFlatbuffer> {
+                use flatbuffers::Verifiable;
+                v.visit_table(pos)?
+                    .visit_field::<i64>("offset", Self::VT_OFFSET, false)?
+                    .visit_field::<i64>("length", Self::VT_LENGTH, false)?
+                    .visit_field::<Format>("format", Self::VT_FORMAT, false)?
+                    .visit_field::<ContentType>("content_type", Self::VT_CONTENT_TYPE, false)?
+                    .finish();
+                Ok(())
+            }
+        }
+        pub struct EmbeddedFileArgs {
+            pub offset: i64,
+            pub length: i64,
+            pub format: Format,
+            pub content_type: ContentType,
+        }
+        impl<'a> Default for EmbeddedFileArgs {
+            #[inline]
+            fn default() -> Self {
+                EmbeddedFileArgs {
+                    offset: 0,
+                    length: 0,
+                    format: Format::FeatherV2,
+                    content_type: ContentType::ReadsTable,
+                }
+            }
+        }
+
+        pub struct EmbeddedFileBuilder<'a: 'b, 'b> {
+            fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>,
+            start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,
+        }
+        impl<'a: 'b, 'b> EmbeddedFileBuilder<'a, 'b> {
+            #[inline]
+            pub fn add_offset(&mut self, offset: i64) {
+                self.fbb_
+                    .push_slot::<i64>(EmbeddedFile::VT_OFFSET, offset, 0);
+            }
+            #[inline]
+            pub fn add_length(&mut self, length: i64) {
+                self.fbb_
+                    .push_slot::<i64>(EmbeddedFile::VT_LENGTH, length, 0);
+            }
+            #[inline]
+            pub fn add_format(&mut self, format: Format) {
+                self.fbb_
+                    .push_slot::<Format>(EmbeddedFile::VT_FORMAT, format, Format::FeatherV2);
+            }
+            #[inline]
+            pub fn add_content_type(&mut self, content_type: ContentType) {
+                self.fbb_.push_slot::<ContentType>(
+                    EmbeddedFile::VT_CONTENT_TYPE,
+                    content_type,
+                    ContentType::ReadsTable,
+                );
+            }
+            #[inline]
+            pub fn new(
+                _fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>,
+            ) -> EmbeddedFileBuilder<'a, 'b> {
+                let start = _fbb.start_table();
+                EmbeddedFileBuilder {
+                    fbb_: _fbb,
+                    start_: start,
+                }
+            }
+            #[inline]
+            pub fn finish(self) -> flatbuffers::WIPOffset<EmbeddedFile<'a>> {
+                let o = self.fbb_.end_table(self.start_);
+                flatbuffers::WIPOffset::new(o.value())
+            }
+        }
+
+        impl core::fmt::Debug for EmbeddedFile<'_> {
+            fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+                let mut ds = f.debug_struct("EmbeddedFile");
+                ds.field("offset", &self.offset());
+                ds.field("length", &self.length());
+                ds.field("format", &self.format());
+                ds.field("content_type", &self.content_type());
+                ds.finish()
+            }
+        }
+        pub enum FooterOffset {}
+        #[derive(Copy, Clone, PartialEq)]
+
+        pub struct Footer<'a> {
+            pub _tab: flatbuffers::Table<'a>,
+        }
+
+        impl<'a> flatbuffers::Follow<'a> for Footer<'a> {
+            type Inner = Footer<'a>;
+            #[inline]
+            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+                Self {
+                    _tab: flatbuffers::Table::new(buf, loc),
+                }
+            }
+        }
+
+        impl<'a> Footer<'a> {
+            pub const VT_FILE_IDENTIFIER: flatbuffers::VOffsetT = 4;
+            pub const VT_SOFTWARE: flatbuffers::VOffsetT = 6;
+            pub const VT_POD5_VERSION: flatbuffers::VOffsetT = 8;
+            pub const VT_CONTENTS: flatbuffers::VOffsetT = 10;
+
+            #[inline]
+            pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+                Footer { _tab: table }
+            }
+            #[allow(unused_mut)]
+            pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(
+                _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>,
+                args: &'args FooterArgs<'args>,
+            ) -> flatbuffers::WIPOffset<Footer<'bldr>> {
+                let mut builder = FooterBuilder::new(_fbb);
+                if let Some(x) = args.contents {
+                    builder.add_contents(x);
+                }
+                if let Some(x) = args.pod5_version {
+                    builder.add_pod5_version(x);
+                }
+                if let Some(x) = args.software {
+                    builder.add_software(x);
+                }
+                if let Some(x) = args.file_identifier {
+                    builder.add_file_identifier(x);
+                }
+                builder.finish()
+            }
+
+            #[inline]
+            pub fn file_identifier(&self) -> Option<&'a str> {
+                // Safety:
+                // Created from valid Table for this object
+                // which contains a valid value in this slot
+                unsafe {
+                    self._tab
+                        .get::<flatbuffers::ForwardsUOffset<&str>>(Footer::VT_FILE_IDENTIFIER, None)
+                }
+            }
+            #[inline]
+            pub fn software(&self) -> Option<&'a str> {
+                // Safety:
+                // Created from valid Table for this object
+                // which contains a valid value in this slot
+                unsafe {
+                    self._tab
+                        .get::<flatbuffers::ForwardsUOffset<&str>>(Footer::VT_SOFTWARE, None)
+                }
+            }
+            #[inline]
+            pub fn pod5_version(&self) -> Option<&'a str> {
+                // Safety:
+                // Created from valid Table for this object
+                // which contains a valid value in this slot
+                unsafe {
+                    self._tab
+                        .get::<flatbuffers::ForwardsUOffset<&str>>(Footer::VT_POD5_VERSION, None)
+                }
+            }
+            #[inline]
+            pub fn contents(
+                &self,
+            ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<EmbeddedFile<'a>>>>
+            {
+                // Safety:
+                // Created from valid Table for this object
+                // which contains a valid value in this slot
+                unsafe {
+                    self._tab.get::<flatbuffers::ForwardsUOffset<
+                        flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<EmbeddedFile>>,
+                    >>(Footer::VT_CONTENTS, None)
+                }
+            }
+        }
+
+        impl flatbuffers::Verifiable for Footer<'_> {
+            #[inline]
+            fn run_verifier(
+                v: &mut flatbuffers::Verifier,
+                pos: usize,
+            ) -> Result<(), flatbuffers::InvalidFlatbuffer> {
+                use flatbuffers::Verifiable;
+                v.visit_table(pos)?
+                    .visit_field::<flatbuffers::ForwardsUOffset<&str>>(
+                        "file_identifier",
+                        Self::VT_FILE_IDENTIFIER,
+                        false,
+                    )?
+                    .visit_field::<flatbuffers::ForwardsUOffset<&str>>(
+                        "software",
+                        Self::VT_SOFTWARE,
+                        false,
+                    )?
+                    .visit_field::<flatbuffers::ForwardsUOffset<&str>>(
+                        "pod5_version",
+                        Self::VT_POD5_VERSION,
+                        false,
+                    )?
+                    .visit_field::<flatbuffers::ForwardsUOffset<
+                        flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<EmbeddedFile>>,
+                    >>("contents", Self::VT_CONTENTS, false)?
+                    .finish();
+                Ok(())
+            }
+        }
+        #[derive(Default)]
+        pub struct FooterArgs<'a> {
+            pub file_identifier: Option<flatbuffers::WIPOffset<&'a str>>,
+            pub software: Option<flatbuffers::WIPOffset<&'a str>>,
+            pub pod5_version: Option<flatbuffers::WIPOffset<&'a str>>,
+            pub contents: Option<
+                flatbuffers::WIPOffset<
+                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<EmbeddedFile<'a>>>,
+                >,
+            >,
+        }
+
+        pub struct FooterBuilder<'a: 'b, 'b> {
+            fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>,
+            start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,
+        }
+        impl<'a: 'b, 'b> FooterBuilder<'a, 'b> {
+            #[inline]
+            pub fn add_file_identifier(
+                &mut self,
+                file_identifier: flatbuffers::WIPOffset<&'b str>,
+            ) {
+                self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
+                    Footer::VT_FILE_IDENTIFIER,
+                    file_identifier,
+                );
+            }
+            #[inline]
+            pub fn add_software(&mut self, software: flatbuffers::WIPOffset<&'b str>) {
+                self.fbb_
+                    .push_slot_always::<flatbuffers::WIPOffset<_>>(Footer::VT_SOFTWARE, software);
+            }
+            #[inline]
+            pub fn add_pod5_version(&mut self, pod5_version: flatbuffers::WIPOffset<&'b str>) {
+                self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
+                    Footer::VT_POD5_VERSION,
+                    pod5_version,
+                );
+            }
+            #[inline]
+            pub fn add_contents(
+                &mut self,
+                contents: flatbuffers::WIPOffset<
+                    flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<EmbeddedFile<'b>>>,
+                >,
+            ) {
+                self.fbb_
+                    .push_slot_always::<flatbuffers::WIPOffset<_>>(Footer::VT_CONTENTS, contents);
+            }
+            #[inline]
+            pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> FooterBuilder<'a, 'b> {
+                let start = _fbb.start_table();
+                FooterBuilder {
+                    fbb_: _fbb,
+                    start_: start,
+                }
+            }
+            #[inline]
+            pub fn finish(self) -> flatbuffers::WIPOffset<Footer<'a>> {
+                let o = self.fbb_.end_table(self.start_);
+                flatbuffers::WIPOffset::new(o.value())
+            }
+        }
+
+        impl core::fmt::Debug for Footer<'_> {
+            fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+                let mut ds = f.debug_struct("Footer");
+                ds.field("file_identifier", &self.file_identifier());
+                ds.field("software", &self.software());
+                ds.field("pod5_version", &self.pod5_version());
+                ds.field("contents", &self.contents());
+                ds.finish()
+            }
+        }
+        #[inline]
+        /// Verifies that a buffer of bytes contains a `Footer`
+        /// and returns it.
+        /// Note that verification is still experimental and may not
+        /// catch every error, or be maximally performant. For the
+        /// previous, unchecked, behavior use
+        /// `root_as_footer_unchecked`.
+        pub fn root_as_footer(buf: &[u8]) -> Result<Footer, flatbuffers::InvalidFlatbuffer> {
+            flatbuffers::root::<Footer>(buf)
+        }
+        #[inline]
+        /// Verifies that a buffer of bytes contains a size prefixed
+        /// `Footer` and returns it.
+        /// Note that verification is still experimental and may not
+        /// catch every error, or be maximally performant. For the
+        /// previous, unchecked, behavior use
+        /// `size_prefixed_root_as_footer_unchecked`.
+        pub fn size_prefixed_root_as_footer(
+            buf: &[u8],
+        ) -> Result<Footer, flatbuffers::InvalidFlatbuffer> {
+            flatbuffers::size_prefixed_root::<Footer>(buf)
+        }
+        #[inline]
+        /// Verifies, with the given options, that a buffer of bytes
+        /// contains a `Footer` and returns it.
+        /// Note that verification is still experimental and may not
+        /// catch every error, or be maximally performant. For the
+        /// previous, unchecked, behavior use
+        /// `root_as_footer_unchecked`.
+        pub fn root_as_footer_with_opts<'b, 'o>(
+            opts: &'o flatbuffers::VerifierOptions,
+            buf: &'b [u8],
+        ) -> Result<Footer<'b>, flatbuffers::InvalidFlatbuffer> {
+            flatbuffers::root_with_opts::<Footer<'b>>(opts, buf)
+        }
+        #[inline]
+        /// Verifies, with the given verifier options, that a buffer of
+        /// bytes contains a size prefixed `Footer` and returns
+        /// it. Note that verification is still experimental and may not
+        /// catch every error, or be maximally performant. For the
+        /// previous, unchecked, behavior use
+        /// `root_as_footer_unchecked`.
+        pub fn size_prefixed_root_as_footer_with_opts<'b, 'o>(
+            opts: &'o flatbuffers::VerifierOptions,
+            buf: &'b [u8],
+        ) -> Result<Footer<'b>, flatbuffers::InvalidFlatbuffer> {
+            flatbuffers::size_prefixed_root_with_opts::<Footer<'b>>(opts, buf)
+        }
+        #[inline]
+        /// Assumes, without verification, that a buffer of bytes contains a Footer and returns it.
+        /// # Safety
+        /// Callers must trust the given bytes do indeed contain a valid `Footer`.
+        pub unsafe fn root_as_footer_unchecked(buf: &[u8]) -> Footer {
+            flatbuffers::root_unchecked::<Footer>(buf)
+        }
+        #[inline]
+        /// Assumes, without verification, that a buffer of bytes contains a size prefixed Footer and returns it.
+        /// # Safety
+        /// Callers must trust the given bytes do indeed contain a valid size prefixed `Footer`.
+        pub unsafe fn size_prefixed_root_as_footer_unchecked(buf: &[u8]) -> Footer {
+            flatbuffers::size_prefixed_root_unchecked::<Footer>(buf)
+        }
+        #[inline]
+        pub fn finish_footer_buffer<'a>(
+            fbb: &mut flatbuffers::FlatBufferBuilder<'a>,
+            root: flatbuffers::WIPOffset<Footer<'a>>,
+        ) {
+            fbb.finish(root, None);
+        }
+
+        #[inline]
+        pub fn finish_size_prefixed_footer_buffer<'a>(
+            fbb: &mut flatbuffers::FlatBufferBuilder<'a>,
+            root: flatbuffers::WIPOffset<Footer<'a>>,
+        ) {
+            fbb.finish_size_prefixed(root, None);
+        }
+    } // pub mod ReadsFormat
+} // pub mod Minknow

+ 7 - 1
src/io/pod5_infos.rs

@@ -7,7 +7,13 @@ use arrow::array::{ArrayRef, Int16Array, StringArray, TimestampMillisecondArray,
 use arrow::{array::RecordBatch, ipc::reader::FileReader};
 use chrono::TimeZone;
 use chrono::{DateTime, Utc};
-use podders::{root_as_footer, ContentType};
+
+use super::pod5_footer_generated::minknow::reads_format::{ContentType, Footer};
+// use podders::{root_as_footer, ContentType};
+
+pub fn root_as_footer(buf: &[u8]) -> Result<Footer, flatbuffers::InvalidFlatbuffer> {
+  flatbuffers::root::<Footer>(buf)
+}
 
 #[derive(Debug, Clone)]
 pub struct Pod5Info {

+ 2 - 1
src/lib.rs

@@ -70,11 +70,12 @@ mod tests {
         let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info"))
             .build();
 
-        let _ = Pod5Collection::new(
+        let coll = Pod5Collection::new(
             "/data/run_data",
             "/data/flow_cells.tsv",
             "/data/longreads_basic_pipe",
         )?;
+        println!("{coll:#?}");
         // let runs = Runs::import_dir("/home/prom/store/banana-pool/run_data", "/data/flow_cells.tsv")?;
         Ok(())
     }