1 use webcore::value::Reference;
2 use webcore::try_from::TryInto;
3 use private::TODO;
4 
5 /// Used by the `dataset` HTML attribute to represent data for custom attributes added to elements.
6 ///
7 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/DOMStringMap)
8 // https://html.spec.whatwg.org/#domstringmap
9 #[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
10 #[reference(instance_of = "DOMStringMap")]
11 pub struct StringMap( Reference );
12 
13 // The methods here are deliberately named exactly as those from Rust's HashMap.
14 impl StringMap {
15     /// Returns a value corresponding to the key.
16     // https://html.spec.whatwg.org/#dom-domstringmap-nameditem
get( &self, key: &str ) -> Option< String >17     pub fn get( &self, key: &str ) -> Option< String > {
18         js!( return @{self}[ @{key} ]; ).try_into().ok()
19     }
20 
21     /// Inserts a key-value pair into the map.
22     // https://html.spec.whatwg.org/#dom-domstringmap-setitem
insert( &self, key: &str, value: &str ) -> Result< (), TODO >23     pub fn insert( &self, key: &str, value: &str ) -> Result< (), TODO > {
24         js!( @(no_return)
25             @{self}[ @{key} ] = @{value};
26         );
27 
28         Ok(())
29     }
30 
31     /// Removes a key from the map.
32     // https://html.spec.whatwg.org/#dom-domstringmap-removeitem
remove( &self, key: &str )33     pub fn remove( &self, key: &str ) {
34         js!( @(no_return)
35             delete @{self}[ @{key} ];
36         );
37     }
38 
39     /// Returns true if the map contains a value for the specified key.
contains_key( &self, key: &str ) -> bool40     pub fn contains_key( &self, key: &str ) -> bool {
41         js!( return @{key} in @{self}; ).try_into().unwrap()
42     }
43 }
44