#!/usr/bin/env bash # # Copyright (C) 2022, Maxim Lihachev, # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation, version 3. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see . # # terraform-mermaid can be used to convert `terraform graph` command output # from Graphviz to Mermaid format. # TODO: -s simple set -e set -o errtrace \unalias -a IFS=$' \t\n' show_help() { echo -e "$(basename "$0") can be used to convert \`terraform graph' command output from Graphviz to Mermaid format.\n" echo -e "USAGE: $(basename "$0") ?-m? ?-d DIRECTION??\n" echo -e "Command line arguments:" echo -e " -h --help Show this help" echo -e " -m --markdown Put the output in triple back quotes (\`\`\`)" echo -e " -d --direction Specify the direction of the graph (TB | BT | LR | RL; TB by default)" echo exit "${1:-0}" } UNKNOWN_ARGS=() while [[ $# -gt 0 ]]; do key="$1" case $key in -h|--help) show_help;; -d|--direction) DIRECTION="$2"; shift; shift;; -m|--markdown) MARKDOWN="true"; shift;; *) UNKNOWN_ARGS+=("$1"); shift;; esac done [ ${#UNKNOWN_ARGS} -gt 0 ] && echo "Unknown parameters: ${UNKNOWN_ARGS[*]}" >&2 && show_help 1 declare -a MERMAID [ -n "$MARKDOWN" ] && MERMAID+=('```mermaid') MERMAID+=("graph ${DIRECTION:-TB}") GRAPH=$(terraform graph) mapfile -t MERMAID_GRAPH < <( echo "$GRAPH" \ | grep -v 'meta\.count' \ | grep -- '->' \ | sed -E 's/"//g; s/^[[:space:]]*|\\]|\[root\] | \((expand|close)\)//g; s!provider.*/!provider:!g; s/helm_release/helm/g; s/null_resource\.//g; s/kubernetes/k8s/g; s/ -> / --> /g; s/^(.*) --> (.*)$/\2 --> \1/; s/(provider:[[:alnum:]_]*)/\1((\1))/; s/((var|local).[[:alnum:]_]*)/\1{{\1}}/; s/(helm\.[[:alnum:]_]*)/\1{{\1}}/; s/(local_file\.[[:alnum:]_]*)/\1>\1]/; s/default/defaulá¹­/; s/class/clasá¹£/g; /^provider:[[:alnum:]_]*/d;' \ | sed 's/^/ /' ) MERMAID=("${MERMAID[@]}" "${MERMAID_GRAPH[@]}") [ -n "$MARKDOWN" ] && MERMAID+=('```') printf "%s\n" "${MERMAID[@]}"