fix: Fix all examples
This commit is contained in:
		@@ -16,62 +16,65 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
 | 
			
		||||
    // Register the Proposal type with Rhai
 | 
			
		||||
    // This function is generated by the #[rhai_model_export] attribute
 | 
			
		||||
    Proposal::register_rhai_bindings_for_proposal(&mut engine, db.clone());
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Register the Ballot type with Rhai
 | 
			
		||||
    Ballot::register_rhai_bindings_for_ballot(&mut engine, db.clone());
 | 
			
		||||
 | 
			
		||||
    // Register a function to get the database instance
 | 
			
		||||
    engine.register_fn("get_db", move || db.clone());
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Register builder functions for Proposal and related types
 | 
			
		||||
    engine.register_fn("create_proposal", |id: i64, creator_id: String, title: String, description: String| {
 | 
			
		||||
        let start_date = Utc::now();
 | 
			
		||||
        let end_date = start_date + Duration::days(14);
 | 
			
		||||
        Proposal::new(id as u32, creator_id, title, description, start_date, end_date)
 | 
			
		||||
        let id_option = if id <= 0 { None } else { Some(id as u32) };
 | 
			
		||||
        Proposal::new(id_option, creator_id, title, description, start_date, end_date)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("create_vote_option", |id: i64, text: String| {
 | 
			
		||||
        VoteOption::new(id as u8, text)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("create_ballot", |id: i64, user_id: i64, vote_option_id: i64, shares_count: i64| {
 | 
			
		||||
        Ballot::new(id as u32, user_id as u32, vote_option_id as u8, shares_count)
 | 
			
		||||
        let id_option = if id <= 0 { None } else { Some(id as u32) };
 | 
			
		||||
        Ballot::new(id_option, user_id as u32, vote_option_id as u8, shares_count)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Register getter and setter methods for Proposal properties
 | 
			
		||||
    engine.register_fn("get_title", |proposal: Proposal| -> String {
 | 
			
		||||
        proposal.title.clone()
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_description", |proposal: Proposal| -> String {
 | 
			
		||||
        proposal.description.clone()
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_creator_id", |proposal: Proposal| -> String {
 | 
			
		||||
        proposal.creator_id.clone()
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_id", |proposal: Proposal| -> i64 {
 | 
			
		||||
        proposal.base_data.id as i64
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_status", |proposal: Proposal| -> String {
 | 
			
		||||
        format!("{:?}", proposal.status)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_vote_status", |proposal: Proposal| -> String {
 | 
			
		||||
        format!("{:?}", proposal.vote_status)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Register methods for proposal operations
 | 
			
		||||
    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)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("cast_vote_on_proposal", |mut proposal: Proposal, ballot_id: i64, user_id: i64, option_id: i64, shares: i64| -> Proposal {
 | 
			
		||||
        proposal.cast_vote(ballot_id as u32, user_id as u32, option_id as u8, shares)
 | 
			
		||||
        let ballot_id_option = if ballot_id <= 0 { None } else { Some(ballot_id as u32) };
 | 
			
		||||
        proposal.cast_vote(ballot_id_option, user_id as u32, option_id as u8, shares)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("change_proposal_status", |mut proposal: Proposal, status_str: String| -> Proposal {
 | 
			
		||||
        let new_status = match status_str.as_str() {
 | 
			
		||||
            "Draft" => ProposalStatus::Draft,
 | 
			
		||||
@@ -83,7 +86,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
 | 
			
		||||
        };
 | 
			
		||||
        proposal.change_proposal_status(new_status)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("change_vote_event_status", |mut proposal: Proposal, status_str: String| -> Proposal {
 | 
			
		||||
        let new_status = match status_str.as_str() {
 | 
			
		||||
            "Open" => VoteEventStatus::Open,
 | 
			
		||||
@@ -93,49 +96,49 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
 | 
			
		||||
        };
 | 
			
		||||
        proposal.change_vote_event_status(new_status)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Register functions for database operations
 | 
			
		||||
    engine.register_fn("save_proposal", |_db: Arc<OurDB>, proposal: Proposal| {
 | 
			
		||||
        println!("Proposal saved: {}", proposal.title);
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_proposal_by_id", |_db: Arc<OurDB>, id: i64| -> Proposal {
 | 
			
		||||
        // In a real implementation, this would retrieve the proposal from the database
 | 
			
		||||
        let start_date = Utc::now();
 | 
			
		||||
        let end_date = start_date + Duration::days(14);
 | 
			
		||||
        Proposal::new(id as u32, "Retrieved Creator", "Retrieved Proposal", "Retrieved Description", start_date, end_date)
 | 
			
		||||
        Proposal::new(Some(id as u32), "Retrieved Creator", "Retrieved Proposal", "Retrieved Description", start_date, end_date)
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Register a function to check if a proposal exists
 | 
			
		||||
    engine.register_fn("proposal_exists", |_db: Arc<OurDB>, id: i64| -> bool {
 | 
			
		||||
        // In a real implementation, this would check if the proposal exists in the database
 | 
			
		||||
        id == 1 || id == 2
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Define the function for get_all_proposals
 | 
			
		||||
    fn get_all_proposals(_db: Arc<OurDB>) -> Vec<Proposal> {
 | 
			
		||||
        // In a real implementation, this would retrieve all proposals from the database
 | 
			
		||||
        let start_date = Utc::now();
 | 
			
		||||
        let end_date = start_date + Duration::days(14);
 | 
			
		||||
        vec![
 | 
			
		||||
            Proposal::new(1, "Creator 1", "Proposal 1", "Description 1", start_date, end_date),
 | 
			
		||||
            Proposal::new(2, "Creator 2", "Proposal 2", "Description 2", start_date, end_date)
 | 
			
		||||
            Proposal::new(Some(1), "Creator 1", "Proposal 1", "Description 1", start_date, end_date),
 | 
			
		||||
            Proposal::new(Some(2), "Creator 2", "Proposal 2", "Description 2", start_date, end_date)
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Register the function with the wrap_vec_return macro
 | 
			
		||||
    engine.register_fn("get_all_proposals", wrap_vec_return!(get_all_proposals, Arc<OurDB> => Proposal));
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("delete_proposal_by_id", |_db: Arc<OurDB>, _id: i64| {
 | 
			
		||||
        // In a real implementation, this would delete the proposal from the database
 | 
			
		||||
        println!("Proposal deleted with ID: {}", _id);
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Register helper functions for accessing proposal options and ballots
 | 
			
		||||
    engine.register_fn("get_option_count", |proposal: Proposal| -> i64 {
 | 
			
		||||
        proposal.options.len() as i64
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_option_at", |proposal: Proposal, index: i64| -> VoteOption {
 | 
			
		||||
        if index >= 0 && index < proposal.options.len() as i64 {
 | 
			
		||||
            proposal.options[index as usize].clone()
 | 
			
		||||
@@ -143,35 +146,35 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
 | 
			
		||||
            VoteOption::new(0, "Invalid Option")
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_option_text", |option: VoteOption| -> String {
 | 
			
		||||
        option.text.clone()
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_option_votes", |option: VoteOption| -> i64 {
 | 
			
		||||
        option.count
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_ballot_count", |proposal: Proposal| -> i64 {
 | 
			
		||||
        proposal.ballots.len() as i64
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_ballot_at", |proposal: Proposal, index: i64| -> Ballot {
 | 
			
		||||
        if index >= 0 && index < proposal.ballots.len() as i64 {
 | 
			
		||||
            proposal.ballots[index as usize].clone()
 | 
			
		||||
        } else {
 | 
			
		||||
            Ballot::new(0, 0, 0, 0)
 | 
			
		||||
            Ballot::new(None, 0, 0, 0)
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_ballot_user_id", |ballot: Ballot| -> i64 {
 | 
			
		||||
        ballot.user_id as i64
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_ballot_option_id", |ballot: Ballot| -> i64 {
 | 
			
		||||
        ballot.vote_option_id as i64
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    engine.register_fn("get_ballot_shares", |ballot: Ballot| -> i64 {
 | 
			
		||||
        ballot.shares_count
 | 
			
		||||
    });
 | 
			
		||||
@@ -179,7 +182,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
 | 
			
		||||
    // Load and evaluate the Rhai script
 | 
			
		||||
    let script_path = Path::new("examples/governance_rhai/governance.rhai");
 | 
			
		||||
    let script = fs::read_to_string(script_path)?;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    match engine.eval::<()>(&script) {
 | 
			
		||||
        Ok(_) => println!("Script executed successfully!"),
 | 
			
		||||
        Err(e) => eprintln!("Script execution failed: {}", e),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
// Get the database instance
 | 
			
		||||
let db = get_db();
 | 
			
		||||
 | 
			
		||||
// Create a new proposal
 | 
			
		||||
let proposal = create_proposal(1, "user_creator_123", "Community Fund Allocation for Q3", 
 | 
			
		||||
// Create a new proposal with auto-generated ID (pass 0 for auto-generated ID)
 | 
			
		||||
let proposal = create_proposal(0, "user_creator_123", "Community Fund Allocation for Q3",
 | 
			
		||||
                              "Proposal to allocate funds for community projects in the third quarter.");
 | 
			
		||||
 | 
			
		||||
print("Created Proposal: '" + get_title(proposal) + "' (ID: " + get_id(proposal) + ")");
 | 
			
		||||
@@ -26,14 +26,14 @@ print("\nProposal saved to database");
 | 
			
		||||
 | 
			
		||||
// Simulate casting votes
 | 
			
		||||
print("\nSimulating Votes...");
 | 
			
		||||
// User 1 votes for 'Approve Allocation' with 100 shares
 | 
			
		||||
// User 1 votes for 'Approve Allocation' with 100 shares (with explicit ballot ID)
 | 
			
		||||
let proposal_with_votes = cast_vote_on_proposal(proposal_with_options, 101, 1, 1, 100);
 | 
			
		||||
// User 2 votes for 'Reject Allocation' with 50 shares
 | 
			
		||||
// User 2 votes for 'Reject Allocation' with 50 shares (with explicit ballot ID)
 | 
			
		||||
proposal_with_votes = cast_vote_on_proposal(proposal_with_votes, 102, 2, 2, 50);
 | 
			
		||||
// User 3 votes for 'Approve Allocation' with 75 shares
 | 
			
		||||
proposal_with_votes = cast_vote_on_proposal(proposal_with_votes, 103, 3, 1, 75);
 | 
			
		||||
// User 4 abstains with 20 shares
 | 
			
		||||
proposal_with_votes = cast_vote_on_proposal(proposal_with_votes, 104, 4, 3, 20);
 | 
			
		||||
// User 3 votes for 'Approve Allocation' with 75 shares (with auto-generated ballot ID)
 | 
			
		||||
proposal_with_votes = cast_vote_on_proposal(proposal_with_votes, 0, 3, 1, 75);
 | 
			
		||||
// User 4 abstains with 20 shares (with auto-generated ballot ID)
 | 
			
		||||
proposal_with_votes = cast_vote_on_proposal(proposal_with_votes, 0, 4, 3, 20);
 | 
			
		||||
 | 
			
		||||
print("\nVote Counts After Simulation:");
 | 
			
		||||
option_count = get_option_count(proposal_with_votes);
 | 
			
		||||
@@ -46,7 +46,7 @@ print("\nBallots Cast:");
 | 
			
		||||
let ballot_count = get_ballot_count(proposal_with_votes);
 | 
			
		||||
for i in range(0, ballot_count) {
 | 
			
		||||
    let ballot = get_ballot_at(proposal_with_votes, i);
 | 
			
		||||
    print("- Ballot ID: " + i + ", User ID: " + get_ballot_user_id(ballot) + 
 | 
			
		||||
    print("- Ballot ID: " + i + ", User ID: " + get_ballot_user_id(ballot) +
 | 
			
		||||
          ", Option ID: " + get_ballot_option_id(ballot) + ", Shares: " + get_ballot_shares(ballot));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user