use crate::bindings;
use std::ffi::CString;
#[derive(Clone, Debug)]
pub enum LangVariant {
Bash,
Posix,
Mksh,
Bats,
}
impl LangVariant {
fn to_ffi_int(&self) -> i32 {
match self {
Self::Bash => 0,
Self::Posix => 1,
Self::Mksh => 2,
Self::Bats => 3,
}
}
}
pub fn is_keyword(word: &str) -> bool {
let word_ffi = CString::new(word).unwrap();
unsafe { bindings::HuskSyntaxIsKeyword(word_ffi.as_ptr() as *mut libc::c_char) != 0 }
}
pub fn quote(input_string: &str, lang_variant: LangVariant) -> Result<String, String> {
let input_ffi = CString::new(input_string).unwrap();
let resp = unsafe {
bindings::HuskSyntaxQuote(
input_ffi.as_ptr() as *mut libc::c_char,
lang_variant.to_ffi_int(),
)
};
let res = unsafe { CString::from_raw(resp.r0).into_string().unwrap() };
if resp.r1 != 0 {
Ok(res)
} else {
Err(res)
}
}
pub fn valid_name(value: &str) -> bool {
let value_ffi = CString::new(value).unwrap();
unsafe { bindings::HuskSyntaxValidName(value_ffi.as_ptr() as *mut libc::c_char) != 0 }
}
pub struct Pos {
ptr: usize,
pub col: u32,
pub line: u32,
pub offset: u32,
}
impl Pos {
pub fn new(offset: u32, line: u32, column: u32) -> Self {
let ptr = unsafe { bindings::HuskSyntaxNewPos(offset, line, column) };
let offset = unsafe { bindings::HuskSyntaxPosOffset(ptr) };
let line = unsafe { bindings::HuskSyntaxPosLine(ptr) };
let col = unsafe { bindings::HuskSyntaxPosCol(ptr) };
Self {
ptr,
col,
line,
offset,
}
}
pub fn after(&self, pos2: &Self) -> bool {
unsafe { bindings::HuskSyntaxPosAfter(self.ptr, pos2.ptr) != 0 }
}
pub fn is_valid(&self) -> bool {
unsafe { bindings::HuskSyntaxPosIsValid(self.ptr) != 0 }
}
}
impl Drop for Pos {
fn drop(&mut self) {
unsafe { bindings::HuskDeleteGoItem(self.ptr) }
}
}
pub struct Parser {
ptr: usize,
}
impl Parser {
pub fn new(keep_comments: bool, stop_at: Option<&str>, lang_variant: LangVariant) -> Self {
let stop_at_ffi_ptr: *mut libc::c_char;
let stop_at_cstring = stop_at.map(|stop_at| CString::new(stop_at).unwrap());
if let Some(string) = stop_at_cstring {
stop_at_ffi_ptr = string.as_ptr() as *mut libc::c_char;
} else {
stop_at_ffi_ptr = std::ptr::null_mut();
}
let ptr = unsafe {
bindings::HuskSyntaxNewParser(
keep_comments as u8,
stop_at_ffi_ptr,
lang_variant.to_ffi_int(),
)
};
Self { ptr }
}
}
impl Drop for Parser {
fn drop(&mut self) {
unsafe { bindings::HuskDeleteGoItem(self.ptr) }
}
}