module Osmocom_CTRL_Types {

/* Definition of abstract types for the CTRL protocol as used in Osmocom.
 * Uses the TITAN "TEXT" codec to auto-generate encoder/decoder functions.
 *
 * (C) 2017 by Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 */

type charstring CtrlVerb ("GET", "SET") with {
	/* see https://www.eclipse.org/forums/index.php/t/1088893/ on why this
	 * match expression is needed here */
	variant "TEXT_CODING(,convert=upper_case,'((GET)|(SET))',case_insensitive)"
};

type charstring CtrlReplyVerb ("GET_REPLY", "SET_REPLY") with {
	variant "TEXT_CODING(,convert=upper_case,'((GET_REPLY)|(SET_REPLY))',case_insensitive)"
};

type charstring CtrlId	(pattern "\d#(1,9)");
type charstring CtrlVariable (pattern "[^, \{\}\[\]\(\)<>\|~\\\^`'\"\?=;/\+&%$\#!]#(1,)");
type charstring CtrlValue (pattern "[^ ]#(0,)");
type charstring CtrlReason;


type record CtrlCommand {
	CtrlVerb	verb,
	CtrlId		id,
	CtrlVariable	variable,
	CtrlValue	val optional	/* only for SET */
} with {
	variant "SEPARATOR(' ',)"
};

type record CtrlResponse {
	CtrlReplyVerb	verb,
	CtrlId		id,
	CtrlVariable	variable,
	CtrlValue	val
} with {
	variant "SEPARATOR(' ',)"
};

type record CtrlError {
	CtrlId		id,
	CtrlReason	reason
} with {
	variant "BEGIN('ERROR ',,case_insensitive)"
	variant "SEPARATOR(' ',)"
};

type record CtrlTrap {
	CtrlVariable	variable,
	CtrlValue	val
} with {
	variant "BEGIN('TRAP 0 ',,case_insensitive)"
	variant "SEPARATOR(' ',)"
};

type union CtrlMessage {
	CtrlCommand	cmd,
	CtrlResponse	resp,
	CtrlError	err,
	CtrlTrap	trap
} with { variant "BEGIN('')" };

external function enc_CtrlMessage(in CtrlMessage id) return charstring
	with { extension "prototype(convert) encode(TEXT)"};

external function dec_CtrlMessage(in charstring id) return CtrlMessage
	with { extension "prototype(convert) decode(TEXT)"};


template CtrlMessage ts_CtrlMsgGet(CtrlId id, CtrlVariable variable) := {
	cmd := {
		verb := "GET",
		id := id,
		variable := variable,
		val := omit
	}
};

template CtrlMessage ts_CtrlMsgSet(CtrlId id, CtrlVariable variable, CtrlValue val) := {
	cmd := {
		verb := "SET",
		id := id,
		variable := variable,
		val := omit
	}
}

template CtrlMessage tr_CtrlMsgGetRepl(template CtrlId id, template CtrlVariable variable := ?) := {
	resp := {
		verb := "GET_REPLY",
		id := id,
		variable := variable,
		val := ?
	}
}

template CtrlMessage tr_CtrlMsgSetRepl(template CtrlId id, template CtrlVariable variable := ?,
			   template CtrlValue val := ?) := {
	resp := {
		verb := "SET_REPLY",
		id := id,
		variable := variable,
		val := val
	}
}

template CtrlMessage tr_CtrlMsgTrap(template CtrlVariable variable := ?,
			template CtrlValue val := ?) := {
	trap := {
		variable := variable,
		val := val
	}
}

template CtrlMessage tr_CtrlMsgError(template CtrlId id := ?, template CtrlReason reason := ?) := {
	err := {
		id := id,
		reason := reason
	}
}


} with { encode "TEXT" }
