fs_make_btrfs() {
	local device="${1}"
	local label="${2}"
	local uuid="${3}"
	if [ -b "${device}" ]; then
		set -- \
			--force \
			--checksum "sha256"
		if [ -n "${label}" ]; then
			set -- "${@}" \
				--label "${label}"
		fi
		if [ -n "${uuid}" ]; then
			set -- "${@}" \
				--uuid "${uuid}"
		fi
		mkfs.btrfs "${@}" "${device}"
	fi
}

fs_make_btrfs_swap() {
	local path="${1}"
	local size="${2}"
	local uuid="${3}"
	if [ -n "${path}" ]; then
		set -- filesystem mkswapfile
		if [ -n "${size}" ]; then
			set -- "${@}" \
				--size "${size}"
		fi
		if [ -n "${uuid}" ]; then
			set -- "${@}" \
				--uuid "${uuid}"
		fi
		btrfs "${@}" "${path}"
	fi
}

fs_make_fat() {
	local device="${1}"
	local name="${2}"
	local volid="${3}"
	if [ -b "${device}" ]; then
		set -- \
			-F 32 \
			-S 4096
		if [ -n "${name}" ]; then
			set -- "${@}" \
				-n "${name}"
		fi
		if [ -n "${volid}" ]; then
			set -- "${@}" \
				-i "${volid}"
		fi
		mkfs.fat "${@}" "${device}"
	fi
}

fs_raid_create() {
	if [ -n "${4}" ]; then
		local name="${1}"
		local uuid="${2}"
		shift 2
		mdadm \
			--create "/dev/md/${name}" \
			--level 0 \
			--metadata 1 \
			--name "md:${name}" \
			--raid-devices ${#} \
			--uuid "${uuid}" \
			"${@}"
	fi
}

fs_wipe() {
	local device="${1}"
	local buffer="${2}"
	local count="${3}"
	if [ -b "${device}" ]; then
		set -- \
			status="progress" \
			if="/dev/zero" \
			of="${device}"
		if [ -n "${buffer}" ]; then
			set -- "${@}" \
				bs="${buffer}"
		fi
		if [ -n "${count}" ]; then
			set -- "${@}" \
				count="${count}"
		fi
		dd "${@}"
	fi
}

luks_format() {
	local passphrase="${1}"
	local device="${2}"
	local label="${3}"
	local uuid="${4}"
	if [ -b "${device}" ]; then
		set -- \
			--batch-mode \
			--cipher "aes-xts-plain64" \
			--hash "sha512" \
			--iter-time 4096 \
			--key-size 512 \
			--pbkdf "argon2id" \
			--type "luks2" \
			--use-random \
			--verbose
		if [ -n "${label}" ]; then
			set -- "${@}" --label "${label}"
		fi
		if [ -n "${uuid}" ]; then
			set -- "${@}" --uuid "${uuid}"
		fi
		echo "${passphrase}" |
			cryptsetup "${@}" luksFormat "${device}"
	fi
}