Updating the Methods
Now we need to update our methods so that we can pass two String
s instead of just one.
set_status
pub fn set_status(&mut self, title: String, body: String) {
let account_id = env::signer_account_id();
self.records.insert(&account_id, &Message { title, body });
}
One thing to note is Message { title, body }
, this is how you can directly create a message without using a new
function like we saw earlier.
get_status
pub fn get_status(&self, account_id: AccountId) -> Option<String> {
self.records
.get(&account_id)
.map(|Message { body, title }| format!(r#"{{"body":"{body}", "title": "{title}"}}"#))
}
Before account_id
was a String
, but now we can use AccountId
directly which will panic the contract if the account id is not valid.
Next we have a new function map, which is a method Option
. And a new syntax |Message { body, title}|
.
map
is a function takes a function as argument. Then if the Option is not None
it will pass the inner value to the function. In Rust an anonymous rust has the following syntax, |x| x + 1
, if you are familiar with JavaScript it is like an arrow function (x) => x + 1
.
Rust let's you ~destructure~ the argument passed to the function.
#![allow(unused)] fn main() { |Message { body, title }| format!(r#"{{"body":"{body}", "title": "{title}"}}"#)) // Is the same as the function |msg| { let body = msg.body; let title = msg.title; format!(r#"{{"body":"{body}", "title": "{title}"}}"#) }) }
Lastly, we are creating a String that represents the JSON representation of Message
, later we won't have to do this by hand.
format!
is a macro for injecting strings into another in this case {body}
and {title}
are replaced by the corresponding variables.
r#".."#
is called a raw string, which let's us use a "
from within the string. And we need two {{
and }}
so that format!
understands that it's actually a {
or }
in the String
.