Documentation
use crate::statement::RequestResource;
use ic_cdk::export::Principal;
use std::collections::LinkedList;

pub struct RequestResourceBuilder {
    data: LinkedList<String>,
}

impl RequestResourceBuilder {
    pub fn new(node: &str) -> RequestResourceBuilder {
        let mut data = LinkedList::new();
        data.push_front(node.to_string());
        RequestResourceBuilder { data }
    }

    pub fn add(mut self, node: &str) -> RequestResourceBuilder {
        self.data.push_front(node.to_string());
        return RequestResourceBuilder { data: self.data };
    }

    pub fn build(mut self) -> RequestResource {
        let mut output = RequestResource::Resource(self.data.pop_front().unwrap());

        while let Some(data) = self.data.pop_front() {
            let tmp = output;
            output = RequestResource::Nested {
                node: data,
                next: Some(Box::new(tmp)),
            }
        }
        return output;
    }
}

pub struct Request {
    action: String,
    resource: RequestResource,
    caller: Principal,
}

impl Request {
    pub fn new(action: String, resource: RequestResource, caller: Principal) -> Self {
        Request {
            action,
            resource,
            caller,
        }
    }
    pub fn action(&self) -> &String {
        &self.action
    }
    pub fn resource(&self) -> &RequestResource {
        &self.resource
    }
    pub fn caller(&self) -> Principal {
        self.caller
    }
}