cao 0.1.2

Update DNS record.


use serde_json::Value;
use crate::error::Error;

use super::intra_common::*;

pub fn add_record(
    domain:      &str,
    key:         &str,
    sub_domain:  &str,
    record_type: &str,
    record_line: &str,
    value:       &str,
) -> Result<Value, Error> {

    let record_line: (&str, &str) =
        if record_line.chars().all(char::is_numeric) {
            (CAO_FORM_RLINE_ID, record_line)
        } else {
            (CAO_FORM_RLINE,    record_line)
        };

    Ok(ureq::post(DNSPOD_ADD_RECORD)
        .set(HTTP_HEADER_USER_AGENT, CAO_USER_AGENT)
        .send_form(&[
            (CAO_FORM_TOKEN,   key),
            (CAO_FORM_DOMAIN,  domain),
            (CAO_FORM_SDOMAIN, sub_domain),
            (CAO_FORM_RTYPE,   record_type),
            record_line,
            (CAO_FORM_VALUE,   value),
        ])?
        .into_json()?
    )
}

pub fn list_record(
    domain:     &str,
    key:        &str,
    offset:     Option<&str>,
    length:     Option<&str>,
    sub_domain: Option<&str>,
) -> Result<Value, Error> {

    let mut form = vec![
        (CAO_FORM_TOKEN,  key),
        (CAO_FORM_DOMAIN, domain),
    ];

    if let Some(offset) = offset {
        form.push((CAO_FORM_OFFSET, offset));
    }
    if let Some(length) = length {
        form.push((CAO_FORM_LENGTH, length));
    }
    if let Some(sub_domain) = sub_domain {
        form.push((CAO_FORM_SDOMAIN, sub_domain));
    }

    Ok(ureq::post(DNSPOD_LIST_RECORDS)
        .set(HTTP_HEADER_USER_AGENT, CAO_USER_AGENT)
        .send_form(form.as_slice())?
        .into_json()?
    )
}

pub fn info_record(
    domain: &str,
    key:    &str,
    id:     &str,
) -> Result<Value, Error> {
    Ok(ureq::post(DNSPOD_INFO_RECORD)
        .set(HTTP_HEADER_USER_AGENT, CAO_USER_AGENT)
        .send_form(&[
            (CAO_FORM_DOMAIN,  domain),
            (CAO_FORM_TOKEN,   key),
            (CAO_FORM_RID,     id),
        ])?
        .into_json()?
    )
}

pub fn modify_record(
    domain:            &str,
    key:               &str,
    id:                &str,
    sub_domain: Option<&str>,
    r_type:            &str,
    r_line:            &str,
    value:             &str,
) -> Result<Value, Error>{
    let mut form: Vec<(&str, &str)> = vec![
        (CAO_FORM_TOKEN,  key),
        (CAO_FORM_DOMAIN, domain),
        (CAO_FORM_RID,    id),
        (CAO_FORM_RTYPE,  r_type),
        (CAO_FORM_VALUE,  value),
    ];

    if let Some(sub_domain) = sub_domain {
        form.push((CAO_FORM_SDOMAIN, sub_domain));
    }
    if r_line.chars().all(char::is_numeric) {
        form.push((CAO_FORM_RLINE_ID, r_line));
    } else {
        form.push((CAO_FORM_RLINE,    r_line));
    }

    Ok(ureq::post(DNSPOD_MODIFY_RECORD)
        .set(HTTP_HEADER_USER_AGENT, CAO_USER_AGENT)
        .send_form(form.as_slice())?
        .into_json()?
    )
}
pub fn delete_record(
    domain: &str,
    key:    &str,
    id:     &str,
) -> Result<Value, Error> {

    Ok(ureq::post(DNSPOD_DELETE_RECORD)
        .set(HTTP_HEADER_USER_AGENT, CAO_USER_AGENT)
        .send_form(&[
            (CAO_FORM_TOKEN,  key),
            (CAO_FORM_DOMAIN, domain),
            (CAO_FORM_RID,    id),
        ])?
        .into_json()?
    )
}