github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/cmd/get_ledger_range_from_times.go (about)

     1  package cmd
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/stellar/stellar-etl/internal/input"
     9  
    10  	"github.com/spf13/cobra"
    11  )
    12  
    13  type ledgerRange struct {
    14  	Start int64 `json:"start"`
    15  	End   int64 `json:"end"`
    16  }
    17  
    18  var getLedgerRangeFromTimesCmd = &cobra.Command{
    19  	Use:   "get_ledger_range_from_times",
    20  	Short: "Converts a time range into a ledger range",
    21  	Long: `Converts a time range into a ledger range. Times must be in the format YYYY-MM-DDTHH:MM:SS.SSSZ.
    22  
    23  	Some examples include: 2006-01-02T15:04:05-07:00, 2009-11-10T18:00:00-05:00, or 2019-09-13T23:00:00+00:00.
    24  	If the time range goes into the future, the ledger range will end on the most recent ledger. If the time
    25  	range covers time before the network started, the ledger range will start with the genesis ledger.`,
    26  	Run: func(cmd *cobra.Command, args []string) {
    27  		startString, err := cmd.Flags().GetString("start-time")
    28  		if err != nil {
    29  			cmdLogger.Fatal("could not get start time: ", err)
    30  		}
    31  
    32  		endString, err := cmd.Flags().GetString("end-time")
    33  		if err != nil {
    34  			cmdLogger.Fatal("could not get end time: ", err)
    35  		}
    36  
    37  		path, err := cmd.Flags().GetString("output")
    38  		if err != nil {
    39  			cmdLogger.Fatal("could not get output path: ", err)
    40  		}
    41  
    42  		isTest, err := cmd.Flags().GetBool("testnet")
    43  		if err != nil {
    44  			cmdLogger.Fatal("could not get testnet boolean: ", err)
    45  		}
    46  
    47          isFuture, err := cmd.Flags().GetBool("futurenet")
    48  		if err != nil {
    49  			cmdLogger.Fatal("could not get futurenet boolean: ", err)
    50  		}
    51  
    52  		formatString := "2006-01-02T15:04:05-07:00"
    53  		startTime, err := time.Parse(formatString, startString)
    54  		if err != nil {
    55  			cmdLogger.Fatal("could not parse start time: ", err)
    56  		}
    57  
    58  		endTime, err := time.Parse(formatString, endString)
    59  		if err != nil {
    60  			cmdLogger.Fatal("could not parse end time: ", err)
    61  		}
    62  
    63  		startLedger, endLedger, err := input.GetLedgerRange(startTime, endTime, isTest, isFuture)
    64  		if err != nil {
    65  			cmdLogger.Fatal("could not calculate ledger range: ", err)
    66  		}
    67  
    68  		toExport := ledgerRange{Start: startLedger, End: endLedger}
    69  		marshalled, err := json.Marshal(toExport)
    70  		if err != nil {
    71  			cmdLogger.Fatal("could not json encode ledger range", err)
    72  		}
    73  
    74  		if path != "" {
    75  			outFile := mustOutFile(path)
    76  			outFile.Write(marshalled)
    77  			outFile.WriteString("\n")
    78  			outFile.Close()
    79  		} else {
    80  			fmt.Println(string(marshalled))
    81  		}
    82  	},
    83  }
    84  
    85  func init() {
    86  	rootCmd.AddCommand(getLedgerRangeFromTimesCmd)
    87  
    88  	getLedgerRangeFromTimesCmd.Flags().StringP("start-time", "s", "", "The start time")
    89  	getLedgerRangeFromTimesCmd.Flags().StringP("end-time", "e", "", "The end time")
    90  	getLedgerRangeFromTimesCmd.Flags().StringP("output", "o", "exported_range.txt", "Filename of the output file")
    91  	getLedgerRangeFromTimesCmd.Flags().Bool("testnet", false, "If set, the batch job will connect to testnet instead of mainnet.")
    92  	getLedgerRangeFromTimesCmd.Flags().Bool("futurenet", false, "If set, the batch job will connect to futurenet instead of mainnet.")
    93  
    94  	getLedgerRangeFromTimesCmd.MarkFlagRequired("start-time")
    95  	getLedgerRangeFromTimesCmd.MarkFlagRequired("end-time")
    96  }