package ch.wlkl.shell;

public class Option extends Top {
	static final String defMark = "-";
	final String mark;
	final String singleOpts;
	final String valueOpts;
	
	public static String single(Object obj) {
		if (obj == null || ! (obj instanceof String))
			return null;
		String opt = (String) obj; 
		return opt.startsWith(defMark) ? opt.substring(defMark.length()) : null;
	}
	
	public Option (String ma, String si, String va) {
		mark = ma;
		singleOpts = si;
		valueOpts = va;
	}
	public Option (String si, String va) {
		this(defMark, si, va);
	}

	public Option (String si) {
		this(defMark, si, "");
	}

	public String analyzeMsg(String src, String [] res) {
		if (src == null) {
			res[0] = res[1] = null;
			return " ";
		} else if (mark.length() > 0 && ! src.startsWith(mark)) {
			res[0] = null;
			res[1] = src;
		} else {
			int cx = mark.length();
			while (cx < src.length() && singleOpts.indexOf(src.charAt(cx)) >= 0)
				cx++;
			if (cx >= src.length()) {
				res[1] = null;
			} else if (valueOpts.indexOf(src.charAt(cx)) >= 0) {
				res[1] = src.substring(++cx);
			} else {
				res[0] = res[1] = null;
				return "ebad option '" + src.charAt(cx) + "' neither in singleOpts " + singleOpts + " nor in valueOpts " + valueOpts;
			}
			res[0] = src.substring(mark.length(), cx);
		}
		return res[0] == null ? "v" : "o";
	}
	
	public boolean analyze(String src, String [] res) {
		String r = analyzeMsg(src, res);
		if (r.charAt(0) == 'e')
			fail(r + " in " + src);
		return r.charAt(0) == 'o';
	}
	
	public static int intOpt(String [] o) {
		int r = 0;
		try {
		r = Integer.parseInt(o[1]);
		} catch (NumberFormatException e) {
			sFail(o[1] + "not a number for value opt '" + o[0] + "': " + e);
		}
		return r;		
	}
}


