@@ -161,6 +161,61 @@ impl AntMinerV2020 {
161161 None
162162 }
163163 }
164+
165+ fn parse_rpc_pool ( idx : usize , pool_info : & Value ) -> PoolData {
166+ PoolData {
167+ position : Some ( idx as u16 ) ,
168+ url : pool_info
169+ . get ( "URL" )
170+ . and_then ( |v| v. as_str ( ) )
171+ . map ( |s| PoolURL :: from ( s. to_string ( ) ) ) ,
172+ accepted_shares : pool_info. get ( "Accepted" ) . and_then ( |v| v. as_u64 ( ) ) ,
173+ rejected_shares : pool_info. get ( "Rejected" ) . and_then ( |v| v. as_u64 ( ) ) ,
174+ active : pool_info. get ( "Stratum Active" ) . and_then ( |v| v. as_bool ( ) ) ,
175+ alive : pool_info
176+ . get ( "Status" )
177+ . and_then ( |v| v. as_str ( ) )
178+ . map ( |s| s == "Alive" ) ,
179+ user : pool_info
180+ . get ( "User" )
181+ . and_then ( |v| v. as_str ( ) )
182+ . map ( String :: from) ,
183+ }
184+ }
185+
186+ fn parse_conf_pool ( idx : usize , pool_info : & Value ) -> Option < PoolData > {
187+ let url = pool_info
188+ . get ( "url" )
189+ . and_then ( |v| v. as_str ( ) )
190+ . filter ( |s| !s. is_empty ( ) )
191+ . map ( |s| PoolURL :: from ( s. to_string ( ) ) ) ;
192+
193+ let user = pool_info
194+ . get ( "user" )
195+ . and_then ( |v| v. as_str ( ) )
196+ . filter ( |s| !s. is_empty ( ) )
197+ . map ( String :: from) ;
198+
199+ let ( url, user) = url. zip ( user) ?;
200+
201+ Some ( PoolData {
202+ position : Some ( idx as u16 ) ,
203+ url : Some ( url) ,
204+ accepted_shares : None ,
205+ rejected_shares : None ,
206+ active : None ,
207+ alive : None ,
208+ user : Some ( user) ,
209+ } )
210+ }
211+
212+ fn as_pool_group ( pools : Vec < PoolData > ) -> Vec < PoolGroupData > {
213+ vec ! [ PoolGroupData {
214+ name: String :: new( ) ,
215+ quota: 1 ,
216+ pools,
217+ } ]
218+ }
164219}
165220
166221#[ async_trait]
@@ -614,46 +669,13 @@ impl GetPools for AntMinerV2020 {
614669 pools_array
615670 . iter ( )
616671 . enumerate ( )
617- . map ( |( idx, pool_info) | {
618- let url = pool_info
619- . get ( "URL" )
620- . and_then ( |v| v. as_str ( ) )
621- . map ( |s| PoolURL :: from ( s. to_string ( ) ) ) ;
622-
623- let user = pool_info
624- . get ( "User" )
625- . and_then ( |v| v. as_str ( ) )
626- . map ( String :: from) ;
627-
628- let alive = pool_info
629- . get ( "Status" )
630- . and_then ( |v| v. as_str ( ) )
631- . map ( |s| s == "Alive" ) ;
632-
633- let active = pool_info. get ( "Stratum Active" ) . and_then ( |v| v. as_bool ( ) ) ;
634- let accepted_shares = pool_info. get ( "Accepted" ) . and_then ( |v| v. as_u64 ( ) ) ;
635- let rejected_shares = pool_info. get ( "Rejected" ) . and_then ( |v| v. as_u64 ( ) ) ;
636-
637- PoolData {
638- position : Some ( idx as u16 ) ,
639- url,
640- accepted_shares,
641- rejected_shares,
642- active,
643- alive,
644- user,
645- }
646- } )
672+ . map ( |( idx, pool_info) | Self :: parse_rpc_pool ( idx, pool_info) )
647673 . collect ( )
648674 } )
649675 . unwrap_or_default ( ) ;
650676
651677 if !rpc_pools. is_empty ( ) {
652- return vec ! [ PoolGroupData {
653- name: String :: new( ) ,
654- quota: 1 ,
655- pools: rpc_pools,
656- } ] ;
678+ return Self :: as_pool_group ( rpc_pools) ;
657679 }
658680
659681 // No RPC data — fall back to conf entirely
@@ -664,43 +686,12 @@ impl GetPools for AntMinerV2020 {
664686 . map ( |arr| {
665687 arr. iter ( )
666688 . enumerate ( )
667- . filter_map ( |( idx, pool_info) | {
668- let url = pool_info
669- . get ( "url" )
670- . and_then ( |v| v. as_str ( ) )
671- . filter ( |s| !s. is_empty ( ) )
672- . map ( |s| PoolURL :: from ( s. to_string ( ) ) ) ;
673-
674- let user = pool_info
675- . get ( "user" )
676- . and_then ( |v| v. as_str ( ) )
677- . filter ( |s| !s. is_empty ( ) )
678- . map ( String :: from) ;
679-
680- // Only include pools with at least a URL and user
681- if url. is_some ( ) && user. is_some ( ) {
682- Some ( PoolData {
683- position : Some ( idx as u16 ) ,
684- url,
685- accepted_shares : None ,
686- rejected_shares : None ,
687- active : None ,
688- alive : None ,
689- user,
690- } )
691- } else {
692- None
693- }
694- } )
689+ . filter_map ( |( idx, pool_info) | Self :: parse_conf_pool ( idx, pool_info) )
695690 . collect ( )
696691 } )
697692 . unwrap_or_default ( ) ;
698693
699- vec ! [ PoolGroupData {
700- name: String :: new( ) ,
701- quota: 1 ,
702- pools: conf_pools,
703- } ]
694+ Self :: as_pool_group ( conf_pools)
704695 }
705696}
706697
@@ -853,13 +844,13 @@ impl SupportsPoolsConfig for AntMinerV2020 {
853844
854845 async fn set_pools_config ( & self , config : Vec < PoolGroupConfig > ) -> anyhow:: Result < bool > {
855846 let pools: Vec < Value > = config
856- . iter ( )
857- . flat_map ( |group| group. pools . iter ( ) )
847+ . into_iter ( )
848+ . flat_map ( |group| group. pools . into_iter ( ) )
858849 . map ( |pool| {
859850 json ! ( {
860851 "url" : pool. url. to_string( ) ,
861- "user" : pool. username. as_str ( ) ,
862- "pass" : pool. password. as_str ( ) ,
852+ "user" : pool. username,
853+ "pass" : pool. password,
863854 } )
864855 } )
865856 . collect ( ) ;
0 commit comments