From f3407daaa3dfcf6c0cd290614c00fa5b15006251 Mon Sep 17 00:00:00 2001
From: Hugo Trentesaux <hugo@trentesaux.fr>
Date: Wed, 7 Jun 2023 14:56:53 +0200
Subject: [PATCH] move tech commands to subcommand

---
 src/commands/collective.rs | 62 +++++++++++++++++++++++++++++++++-----
 src/main.rs                | 50 +++---------------------------
 2 files changed, 60 insertions(+), 52 deletions(-)

diff --git a/src/commands/collective.rs b/src/commands/collective.rs
index ed5fb88..698be58 100644
--- a/src/commands/collective.rs
+++ b/src/commands/collective.rs
@@ -1,9 +1,57 @@
 use crate::*;
 
 use anyhow::Result;
-use sp_core::{sr25519::Pair, H256};
 use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner};
 
+/// define technical committee subcommands
+#[derive(Clone, Default, Debug, clap::Parser)]
+pub enum Subcommand {
+	#[default]
+	/// List members of the technical committee
+	Members,
+	/// List proposals to the technical committee
+	Proposals,
+	/// Vote a proposal to the technical committee
+	Vote {
+		/// Proposal hash
+		hash: Hash,
+		/// Proposal index
+		index: u32,
+		/// Vote (0=against, 1=for)
+		vote: u8,
+	},
+}
+
+/// handle technical committee commands
+pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<()> {
+	let mut data = data.build_client().await?.build_indexer().await?;
+	match command {
+		Subcommand::Members => {
+			data = data.build_client().await?;
+			commands::collective::technical_committee_members(&data).await?
+		}
+		Subcommand::Proposals => {
+			data = data.build_client().await?;
+			commands::collective::technical_committee_proposals(data.client()).await?
+		}
+		Subcommand::Vote { hash, index, vote } => {
+			data = data.build_client().await?;
+			let vote = match vote {
+				0 => false,
+				1 => true,
+				_ => panic!("Vote must be written 0 if you disagree, or 1 if you agree."),
+			};
+			commands::collective::technical_committee_vote(
+				&data, hash, //Hash::from_str(&hash).expect("Invalid hash formatting"),
+				index, vote,
+			)
+			.await?;
+		}
+	};
+
+	Ok(())
+}
+
 /// list technical committee members
 pub async fn technical_committee_members(data: &Data) -> Result<()> {
 	let client = data.client();
@@ -67,7 +115,7 @@ pub async fn technical_committee_proposals(client: &Client) -> Result<()> {
 		.iter(
 			runtime::storage()
 				.technical_committee()
-				.proposal_of(H256::default()),
+				.proposal_of(Hash::default()),
 			10,
 			Some(parent_hash),
 		)
@@ -83,19 +131,19 @@ pub async fn technical_committee_proposals(client: &Client) -> Result<()> {
 
 /// submit vote to technical committee
 pub async fn technical_committee_vote(
-	pair: Pair,
-	client: &Client,
-	proposal_hash: H256,
+	data: &Data,
+	proposal_hash: Hash,
 	proposal_index: u32,
 	vote: bool,
 ) -> Result<(), subxt::Error> {
-	let progress = client
+	let progress = data
+		.client()
 		.tx()
 		.sign_and_submit_then_watch(
 			&runtime::tx()
 				.technical_committee()
 				.vote(proposal_hash, proposal_index, vote),
-			&PairSigner::new(pair),
+			&PairSigner::new(data.keypair()),
 			BaseExtrinsicParamsBuilder::new(),
 		)
 		.await?;
diff --git a/src/main.rs b/src/main.rs
index 896d001..410f2a6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -11,7 +11,7 @@ use codec::Encode;
 use data::*;
 use keys::*;
 use serde::Deserialize;
-use sp_core::{sr25519::Pair, Pair as _, H256};
+use sp_core::{sr25519::Pair, Pair as _};
 use subxt::blocks::ExtrinsicEvents;
 use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner, TxStatus};
 
@@ -174,19 +174,6 @@ pub enum Subcommand {
 	SpamRoll {
 		actual_repart: usize,
 	},
-	/// List members of the technical committee
-	TechMembers,
-	/// List proposals to the technical committee
-	TechProposals,
-	/// Vote a proposal to the technical committee
-	TechVote {
-		/// Proposal hash
-		hash: H256,
-		/// Proposal index
-		index: u32,
-		/// Vote (0=against, 1=for)
-		vote: u8,
-	},
 	Transfer {
 		/// Amount to transfer
 		amount: u64,
@@ -214,6 +201,9 @@ pub enum Subcommand {
 	/// Smith subcommands
 	#[clap(subcommand)]
 	Smith(commands::smith::Subcommand),
+	/// Tech subcommands
+	#[clap(subcommand)]
+	Tech(commands::collective::Subcommand),
 	/// Universal Dividend subcommands
 	#[clap(subcommand)]
 	Ud(commands::ud::Subcommand),
@@ -287,37 +277,6 @@ async fn main() -> Result<(), GcliError> {
 			)
 			.await?
 		}
-		Subcommand::TechMembers => {
-			data = data.build_client().await?;
-			commands::collective::technical_committee_members(&data).await?
-		}
-		Subcommand::TechProposals => {
-			data = data.build_client().await?;
-			commands::collective::technical_committee_proposals(data.client()).await?
-		}
-		Subcommand::TechVote { hash, index, vote } => {
-			data = data.build_client().await?;
-			let vote = match vote {
-				0 => false,
-				1 => true,
-				_ => panic!("Vote must be written 0 if you disagree, or 1 if you agree."),
-			};
-			commands::collective::technical_committee_vote(
-				get_keys(
-					args.secret_format,
-					&args.address,
-					&args.secret,
-					NeededKeys::Secret,
-				)?
-				.1
-				.unwrap(),
-				data.client(),
-				hash, //H256::from_str(&hash).expect("Invalid hash formatting"),
-				index,
-				vote,
-			)
-			.await?;
-		}
 		Subcommand::Transfer {
 			amount,
 			dest,
@@ -375,6 +334,7 @@ async fn main() -> Result<(), GcliError> {
 		}
 		Subcommand::Identity(subcommand) => commands::identity::handle_command(data, subcommand).await?,
 		Subcommand::Smith(subcommand) => commands::smith::handle_command(data, subcommand).await?,
+		Subcommand::Tech(subcommand) => commands::collective::handle_command(data, subcommand).await?,
 		Subcommand::Ud(subcommand) => commands::ud::handle_command(data, subcommand).await?,
 		Subcommand::Oneshot(subcommand) => {
 			commands::oneshot::handle_command(data, subcommand).await?
-- 
GitLab