use std::{collections::HashMap, io::Write};
use serde::{Deserialize, Serialize};
use crate::util::indented_writer::IndentedWriter;
#[derive(Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct JavaConfig {
pub header_comment: HeaderComment,
pub package: Option<String>,
pub prefix: Option<String>,
pub type_mappings: HashMap<String, String>,
pub namespace_class: bool,
pub serializer: JavaSerializerOptions,
pub indent: IndentOptions,
}
impl Default for JavaConfig {
fn default() -> Self {
Self {
header_comment: HeaderComment::None,
package: None,
prefix: None,
type_mappings: HashMap::with_capacity(0),
namespace_class: true,
serializer: JavaSerializerOptions::None,
indent: IndentOptions::default(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum HeaderComment {
None,
Custom { comment: String },
Default,
}
#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum JavaSerializerOptions {
None,
Gson,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum IndentOptions {
Tabs { size: usize },
Spaces { size: usize },
}
impl IndentOptions {
pub fn char(&self) -> char {
match self {
Self::Tabs { .. } => '\t',
Self::Spaces { .. } => ' ',
}
}
pub fn size(&self) -> usize {
match self {
IndentOptions::Tabs { size } => *size,
IndentOptions::Spaces { size } => *size,
}
}
pub fn to_indented_writer<'a, W: Write>(&self, w: &'a mut W) -> IndentedWriter<'a, W> {
IndentedWriter::new(w, self.char(), self.size())
}
pub fn indent_whitespace(&self, indent: usize) -> String {
self.char().to_string().repeat(indent * self.size())
}
pub fn indent<S: AsRef<str>>(&self, line: S, indent: usize) -> String {
format!("{}{}", self.indent_whitespace(indent), line.as_ref())
}
pub fn indent_once<S: AsRef<str>>(&self, line: S) -> String {
format!("{}{}", self.indent_whitespace(1), line.as_ref())
}
}
impl Default for IndentOptions {
fn default() -> Self {
Self::Tabs { size: 1 }
}
}