package io.github.lucaseasedup.logit.util;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class IniUtils
{
private IniUtils()
{
}
public static Map<String, Map<String, String>> unserialize(InputStream in)
throws IOException
{
if (in == null)
throw new IllegalArgumentException();
Map<String, Map<String, String>> result = new LinkedHashMap<>();
try (BufferedReader br = new BufferedReader(new InputStreamReader(in)))
{
String line;
String section = null;
while ((line = br.readLine()) != null)
{
Matcher matcher = SECTION_PATTERN.matcher(line);
if (matcher.matches())
{
section = matcher.group(1).trim();
result.put(section, new LinkedHashMap<String, String>());
}
else if (section != null)
{
matcher = KEY_VALUE_PATTERN.matcher(line);
if (matcher.matches())
{
String key = matcher.group(1).trim();
String value = matcher.group(2).trim();
result.get(section).put(key, value);
}
}
}
}
return result;
}
public static Map<String, Map<String, String>> unserialize(String in)
throws IOException
{
return unserialize(new ByteArrayInputStream(in.getBytes()));
}
public static void serialize(Map<String, Map<String, String>> in,
OutputStream out)
throws IOException
{
if (in == null || out == null)
throw new IllegalArgumentException();
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)))
{
for (Map.Entry<String, Map<String, String>> section : in.entrySet())
{
bw.write("[");
bw.write(section.getKey());
bw.write("]");
bw.newLine();
for (Map.Entry<String, String> kv : section.getValue().entrySet())
{
if (kv.getValue() != null)
{
bw.write(kv.getKey());
bw.write("=");
bw.write(kv.getValue());
bw.newLine();
}
}
bw.newLine();
}
}
}
public static String serialize(Map<String, Map<String, String>> in)
throws IOException
{
if (in == null)
throw new IllegalArgumentException();
OutputStream outputStream = new ByteArrayOutputStream();
serialize(in, outputStream);
return outputStream.toString();
}
private static final Pattern SECTION_PATTERN = Pattern.compile("\\s*\\[([^]]*)\\]\\s*");
private static final Pattern KEY_VALUE_PATTERN = Pattern.compile("\\s*([^=]*)=(.*)");
}