/// My old csv code. Extremely basic functionality.
module arsd.csv;

import std.string;
import std.array;

/// Returns the array of csv rows from the given in-memory data (the argument is NOT a filename).
string[][] readCsv(string data) {
	data = data.replace("\r\n", "\n");
	data = data.replace("\r", "");

	//auto idx = data.indexOf("\n");
	//data = data[idx + 1 .. $]; // skip headers

	string[] fields;
	string[][] records;

	string[] current;

	int state = 0;
	string field;
	foreach(c; data) {
		tryit: switch(state) {
			default: assert(0);
			case 0: // normal
				if(c == '"')
					state = 1;
				else if(c == ',') {
					// commit field
					current ~= field;
					field = null;
				} else if(c == '\n') {
					// commit record
					current ~= field;

					records ~= current;
					current = null;
					field = null;
				} else
					field ~= c;
			break;
			case 1: // in quote
				if(c == '"') {
					state = 2;
				} else
					field ~= c;
			break;
			case 2: // is it a closing quote or an escaped one?
				if(c == '"') {
					field ~= c;
					state = 1;
				} else {
					state = 0;
					goto tryit;
				}
		}
	}

	if(field !is null)
		current ~= field;
	if(current !is null)
		records ~= current;


	return records;
}

/// Formats the given rows into csv format. Use like `std.file.write(toCsv(...));`
string toCsv(string[][] rows) {
	string data;

	foreach(ridx, row; rows) {
		if(ridx) data ~= "\n";
		foreach(idx, cell; row) {
			if(idx) data ~= ",";

			if(cell.indexOf(",") != -1 || cell.indexOf("\"") != -1 || cell.indexOf("\n") != -1) {
				data ~= "\"";
				data ~= cell.replace(`"`, `""`);
				data ~= "\"";
			} else {
				data ~= cell;
			}
		}
	}

	return data;
}