ttags 0.4.3

Generate ctags using Tree Sitter
Documentation
use crate::config::Config;
use std::path::Path;
use sugar_path::SugarPath;

#[derive(Clone)]
pub struct Tag {
    pub name: String,
    pub filename: String,
    pub row: usize,
    pub kind: String,
}

impl Tag {
    pub fn parse(tag: &str) -> Self {
        let parts = tag.trim().split('\t').collect::<Vec<&str>>();
        let name = parts[0].to_string();
        let filename = Path::new(parts[1])
            .resolve()
            .into_os_string()
            .into_string()
            .unwrap();
        let row = parts[2];
        let kind = parts[3].to_string();

        Tag {
            name,
            filename,
            row: row[0..row.len() - 2].parse::<usize>().unwrap(),
            kind,
        }
    }

    pub fn new(name: &str, filename: &str, row: usize, kind: &str) -> Self {
        Tag {
            name: name.to_owned(),
            filename: filename.to_owned(),
            row,
            kind: kind.to_owned(),
        }
    }

    pub fn as_bytes(&self, config: &Config) -> Vec<u8> {
        format!(
            "{}\t{}\t{};\"\t{}\n",
            self.name,
            config.path_relative_to_file(&self.filename),
            self.row,
            self.kind
        )
        .as_bytes()
        .to_vec()
    }
}