github.com/pix4d/terravalet@v0.8.1-0.20240131132849-abcd6a79eeeb/cmdremove.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  	"strings"
     8  )
     9  
    10  func doRemove(planPath string, upPath string) error {
    11  	planFile, err := os.Open(planPath)
    12  	if err != nil {
    13  		return fmt.Errorf("remove: opening the plan file: %s", err)
    14  	}
    15  	defer planFile.Close()
    16  
    17  	upFile, err := os.Create(upPath)
    18  	if err != nil {
    19  		return fmt.Errorf("remove: creating the up file: %s", err)
    20  	}
    21  	defer upFile.Close()
    22  
    23  	toCreate, toDestroy, err := parse(planFile)
    24  	if err != nil {
    25  		return fmt.Errorf("remove: parsing plan: %s", err)
    26  	}
    27  	if toCreate.Size() > 0 {
    28  		return fmt.Errorf("remove: plan contains resources to create: %v",
    29  			sorted(toCreate.List()))
    30  	}
    31  
    32  	var bld strings.Builder
    33  	generateRemoveScript(&bld, sorted(toDestroy.List()))
    34  	_, err = upFile.WriteString(bld.String())
    35  	if err != nil {
    36  		return fmt.Errorf("remove: writing script file: %s", err)
    37  	}
    38  
    39  	return nil
    40  }
    41  
    42  func generateRemoveScript(wr io.Writer, addresses []string) {
    43  	fmt.Fprintf(wr, `#! /bin/sh
    44  # DO NOT EDIT. Generated by https://github.com/pix4D/terravalet
    45  # This script will remove %d items.
    46  
    47  set -e
    48  
    49  `, len(addresses))
    50  	for _, addr := range addresses {
    51  		fmt.Fprintf(wr, "terraform state rm '%s'\n", addr)
    52  	}
    53  	fmt.Fprintln(wr)
    54  }