objectToSaneObject.coffee 1.08 KB
{object} = require 'utila'

module.exports = self =

	sanitize: (val) ->

		self._toChildren val

	_toChildren: (val) ->

		if object.isBareObject val

			return self._objectToChildren val

		else if Array.isArray val

			return self._arrayToChildren val

		else if val is null or typeof val is 'undefined'

			return []

		else if typeof val in ['string', 'number']

			return [String val]

		else

			throw Error "not a valid child node: `#{val}"

	_objectToChildren: (o) ->

		a = []

		for own key, val of o

			cur = {}

			cur[key] = self.sanitize val

			a.push cur

		a

	_arrayToChildren: (a) ->

		ret = []

		for v in a

			ret.push self._toNode v

		ret

	_toNode: (o) ->

		if typeof o in ['string', 'number']

			return String o

		else if object.isBareObject o

			keys = Object.keys(o)

			if keys.length isnt 1

				throw Error "a node must only have one key as tag name"

			key = keys[0]

			obj = {}

			obj[key] = self._toChildren o[key]

			return obj

		else

			throw Error "not a valid node: `#{o}`"