use core::ops::{Deref, DerefMut};
use crate::Url;
use crate::search_params::SearchParams;
#[derive(Debug)]
pub struct QueryPairsMut<'m, 'u> {
url: &'m mut Url<'u>,
params: SearchParams,
}
pub(crate) fn new<'m, 'u>(url: &'m mut Url<'u>) -> QueryPairsMut<'m, 'u> {
let params = url.search_params();
QueryPairsMut { url, params }
}
impl Drop for QueryPairsMut<'_, '_> {
fn drop(&mut self) {
self.url.set_search_params(&self.params);
}
}
impl Deref for QueryPairsMut<'_, '_> {
type Target = SearchParams;
#[inline]
fn deref(&self) -> &Self::Target {
&self.params
}
}
impl DerefMut for QueryPairsMut<'_, '_> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.params
}
}
impl QueryPairsMut<'_, '_> {
pub fn append(&mut self, name: &str, value: &str) -> &mut Self {
self.params.append(name, value);
self
}
pub fn set(&mut self, name: &str, value: &str) -> &mut Self {
self.params.set(name, value);
self
}
pub fn remove(&mut self, name: &str) -> &mut Self {
let _ = self.params.delete(name);
self
}
pub fn clear(&mut self) -> &mut Self {
self.params.clear();
self
}
pub fn finish(mut self) {
let params = core::mem::take(&mut self.params);
self.url.set_search_params(¶ms);
core::mem::forget(self);
}
}