11use super :: misc:: write_record;
22use crate :: { errors:: FqkitError , utils:: file_reader, utils:: file_writer} ;
3- use bio:: io:: fasta;
43use log:: { error, warn} ;
5- use paraseq:: fastq;
4+ use paraseq:: { fastq, fasta } ;
65use std:: collections:: HashMap ;
76
87pub fn cut_adapter (
@@ -14,19 +13,21 @@ pub fn cut_adapter(
1413 compression_level : u32 ,
1514 stdout_type : char ,
1615) -> Result < ( ) , FqkitError > {
17- let seqfile_reader = file_reader ( Some ( seqfile) ) . map ( fasta:: Reader :: new) ?;
18-
16+ let mut seqfile_reader = file_reader ( Some ( seqfile) ) . map ( fasta:: Reader :: new) ?;
17+ let mut faset = fasta :: RecordSet :: default ( ) ;
1918 let mut seqs = HashMap :: new ( ) ;
20- let iters = seqfile_reader. records ( ) ;
21- for rec in iters. map_while ( Result :: ok) {
22- if seqs. contains_key ( rec. id ( ) ) {
23- warn ! ( "found duplicate sequence id: {}, keep first one" , rec. id( ) ) ;
24- continue ;
25- } else {
26- seqs. entry ( rec. id ( ) . to_owned ( ) )
27- . or_insert ( rec. seq ( ) . to_owned ( ) ) ;
19+
20+ while faset. fill ( & mut seqfile_reader) ? {
21+ for rec in faset. iter ( ) . map_while ( Result :: ok) {
22+ if seqs. contains_key ( rec. id ( ) ) {
23+ warn ! ( "found duplicate sequence id: {}, keep first one" , std:: str :: from_utf8( rec. id( ) ) ?) ;
24+ continue ;
25+ } else {
26+ seqs. entry ( rec. id ( ) . to_owned ( ) ) . or_insert ( rec. seq ( ) . to_vec ( ) ) ;
27+ }
2828 }
2929 }
30+
3031 if seqs. is_empty ( ) {
3132 error ! ( "{}" , FqkitError :: EmptyFile ( seqfile. to_string( ) ) ) ;
3233 std:: process:: exit ( 1 ) ;
0 commit comments