From bebb35e6862a911936406785dfe5ab73edfd84a3 Mon Sep 17 00:00:00 2001 From: Mahmoud-Emad Date: Wed, 21 May 2025 12:41:16 +0300 Subject: [PATCH] feat: Added optional vote comment to the proposal vote fields --- .../governance_proposal_example/main.rs | 18 +++++++++++----- .../examples/governance_rhai/example.rs | 14 ++++++++++--- heromodels/src/models/governance/proposal.rs | 21 ++++++++++++------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/heromodels/examples/governance_proposal_example/main.rs b/heromodels/examples/governance_proposal_example/main.rs index 13c2f69..f9221d0 100644 --- a/heromodels/examples/governance_proposal_example/main.rs +++ b/heromodels/examples/governance_proposal_example/main.rs @@ -39,9 +39,9 @@ fn main() { ); // Add vote options - proposal = proposal.add_option(1, "Approve Allocation"); - proposal = proposal.add_option(2, "Reject Allocation"); - proposal = proposal.add_option(3, "Abstain"); + proposal = proposal.add_option(1, "Approve Allocation", Some("This is the approval option")); + proposal = proposal.add_option(2, "Reject Allocation", Some("This is the rejection option")); + proposal = proposal.add_option(3, "Abstain", Some("This is the abstain option")); println!("Added Vote Options:"); for option in &proposal.options { @@ -139,8 +139,16 @@ fn main() { Utc::now() + Duration::days(7), ); private_proposal.private_group = Some(vec![10, 20, 30]); // Only users 10, 20, 30 can vote - private_proposal = private_proposal.add_option(1, "Accept Restructure"); - private_proposal = private_proposal.add_option(2, "Reject Restructure"); + private_proposal = private_proposal.add_option( + 1, + "Accept Restructure", + Some("This is the accept restructure option".to_string()), + ); + private_proposal = private_proposal.add_option( + 2, + "Reject Restructure", + Some("This is the reject restructure option".to_string()), + ); println!( "\nBefore saving - Created Private Proposal: '{}'", diff --git a/heromodels/examples/governance_rhai/example.rs b/heromodels/examples/governance_rhai/example.rs index 9ee4394..f6ee8fe 100644 --- a/heromodels/examples/governance_rhai/example.rs +++ b/heromodels/examples/governance_rhai/example.rs @@ -48,7 +48,7 @@ fn main() -> Result<(), Box> { ); engine.register_fn("create_vote_option", |id: i64, text: String| { - VoteOption::new(id as u8, text) + VoteOption::new(id as u8, text, Some("This is an optional comment")) }); engine.register_fn( @@ -93,7 +93,11 @@ fn main() -> Result<(), Box> { engine.register_fn( "add_option_to_proposal", |mut proposal: Proposal, option_id: i64, option_text: String| -> Proposal { - proposal.add_option(option_id as u8, option_text) + proposal.add_option( + option_id as u8, + option_text, + Some("This is an optional comment".to_string()), + ) }, ); @@ -229,7 +233,11 @@ fn main() -> Result<(), Box> { if index >= 0 && index < proposal.options.len() as i64 { proposal.options[index as usize].clone() } else { - VoteOption::new(0, "Invalid Option") + VoteOption::new( + 0, + "Invalid Option", + Some("This is an invalid option".to_string()), + ) } }, ); diff --git a/heromodels/src/models/governance/proposal.rs b/heromodels/src/models/governance/proposal.rs index 57eaa56..5a715ab 100644 --- a/heromodels/src/models/governance/proposal.rs +++ b/heromodels/src/models/governance/proposal.rs @@ -45,19 +45,21 @@ impl Default for VoteEventStatus { /// VoteOption represents a specific choice that can be voted on #[derive(Debug, Clone, Serialize, Deserialize, CustomType)] pub struct VoteOption { - pub id: u8, // Simple identifier for this option - pub text: String, // Descriptive text of the option - pub count: i64, // How many votes this option has received - pub min_valid: Option, // Optional: minimum votes needed + pub id: u8, // Simple identifier for this option + pub text: String, // Descriptive text of the option + pub count: i64, // How many votes this option has received + pub min_valid: Option, // Optional: minimum votes needed, + pub comment: Option, // Optional: comment } impl VoteOption { - pub fn new(id: u8, text: impl ToString) -> Self { + pub fn new(id: u8, text: impl ToString, comment: Option) -> Self { Self { id, text: text.to_string(), count: 0, min_valid: None, + comment: comment.map(|c| c.to_string()), } } } @@ -166,8 +168,13 @@ impl Proposal { } } - pub fn add_option(mut self, option_id: u8, option_text: impl ToString) -> Self { - let new_option = VoteOption::new(option_id, option_text); + pub fn add_option( + mut self, + option_id: u8, + option_text: impl ToString, + comment: Option, + ) -> Self { + let new_option = VoteOption::new(option_id, option_text, comment); self.options.push(new_option); self }