Skip to content

Commit bf877b3

Browse files
committed
refactor(antminer): simplify pool parsing and pool config mapping
1 parent b051c9f commit bf877b3

1 file changed

Lines changed: 63 additions & 72 deletions

File tree

  • asic-rs-firmwares/antminer/src/backends/v2020

asic-rs-firmwares/antminer/src/backends/v2020/mod.rs

Lines changed: 63 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)