#!/bin/bash -e
# rangemap.go.in -> specialized with concrete types
# gen-rangemap TYPE VALUE out

# Copyright (C) 2018-2021  Nexedi SA and Contributors.
#                          Kirill Smelkov <kirr@nexedi.com>
#
# This program is free software: you can Use, Study, Modify and Redistribute
# it under the terms of the GNU General Public License version 3, or (at your
# option) any later version, as published by the Free Software Foundation.
#
# You can also Link and Combine this program with other software covered by
# the terms of any of the Free Software licenses or any of the Open Source
# Initiative approved licenses and Convey the resulting work. Corresponding
# source of such a combination shall include the source code for all other
# software used.
#
# This program is distributed WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# See COPYING file for full licensing terms.
# See https://www.nexedi.com/licensing for rationale and options.

TYPE=$1
VALUE=$2
out=$3

input=$(dirname $0)/rangemap.go.in
blib=$(cd $(dirname $0) && go list) # fullpath for blib package
curr=$(go list)                     # ----//----   current package
pkgname=$(go list -f {{.Name}})     # name of current package

echo "// Code generated by gen-rangemap $TYPE $VALUE; DO NOT EDIT." >$out
echo >>$out

# fiximports adjusts rangemap.go code to work outside of blib packages.
fiximports() {
	if [ "$curr" == "$blib" ]; then
		cat
		return
	fi

	sed	\
		-e "/package blib/a \\\\nimport \"$blib\"\\n"	\
		-e "s/package blib/package $pkgname/g"	\
		-e 's/\([^\w.]\)KeyRange\b/\1blib.KeyRange/g'	\
		-e 's/\bKStr\b/blib.KStr/g'
}

sed	\
	-e "s/VALUE/$VALUE/g"		\
	-e "s/\bRangedMap\b/${TYPE}/g"			\
	-e "s/\bRangedMapEntry\b/${TYPE}Entry/g"		\
	-e "s/\bvInsert\b/vInsert_${TYPE}/g"		\
	-e "s/\bvDeleteSlice\b/vDeleteSlice_${TYPE}/g"	\
	-e "s/\bvReplaceSlice\b/vReplaceSlice_${TYPE}/g"\
	-e "s/\btraceRangeMap\b/trace${TYPE}/g"		\
	-e "s/\bdebugRangeMap\b/debug${TYPE}/g"		\
	-e "s/\bdebugfRMap\b/debugf${TYPE}/g"		\
	$input |fiximports >>$out
