github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/internal/chunks/handle_manifest.go (about)

     1  // Copyright 2021 The TrueBlocks Authors. All rights reserved.
     2  // Use of this source code is governed by a license that can
     3  // be found in the LICENSE file.
     4  
     5  package chunksPkg
     6  
     7  import (
     8  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base"
     9  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/manifest"
    10  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/output"
    11  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/tslib"
    12  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types"
    13  )
    14  
    15  var sourceMap = map[bool]manifest.Source{
    16  	false: manifest.LocalCache,
    17  	true:  manifest.FromContract,
    18  }
    19  
    20  func (opts *ChunksOptions) HandleManifest(rCtx *output.RenderCtx, blockNums []base.Blknum) error {
    21  	chain := opts.Globals.Chain
    22  	testMode := opts.Globals.TestMode
    23  	man, err := manifest.LoadManifest(chain, opts.PublisherAddr, sourceMap[opts.Remote])
    24  	if err != nil {
    25  		return err
    26  	}
    27  	if testMode {
    28  		if len(man.Chunks) > 10 {
    29  			man.Chunks = man.Chunks[:10]
    30  		}
    31  		man.Specification = "--testing-hash--"
    32  	}
    33  
    34  	if opts.Globals.Format == "txt" || opts.Globals.Format == "csv" {
    35  		fetchData := func(modelChan chan types.Modeler, errorChan chan error) {
    36  			for _, chunk := range man.Chunks {
    37  				rng := base.RangeFromRangeString(chunk.Range)
    38  				s := types.ChunkRecord{
    39  					Range:     rng.String(),
    40  					BloomHash: chunk.BloomHash,
    41  					BloomSize: chunk.BloomSize,
    42  					IndexHash: chunk.IndexHash,
    43  					IndexSize: chunk.IndexSize,
    44  				}
    45  				rd := tslib.RangeToBounds(chain, &rng)
    46  				s.RangeDates = &rd
    47  				modelChan <- &s
    48  			}
    49  		}
    50  
    51  		return output.StreamMany(rCtx, fetchData, opts.Globals.OutputOpts())
    52  
    53  	} else {
    54  		fetchData := func(modelChan chan types.Modeler, errorChan chan error) {
    55  			s := types.Manifest{
    56  				Version:       man.Version,
    57  				Chain:         man.Chain,
    58  				Specification: man.Specification,
    59  			}
    60  			for _, chunk := range man.Chunks {
    61  				rng := base.RangeFromRangeString(chunk.Range)
    62  				ch := types.ChunkRecord{
    63  					Range:     rng.String(),
    64  					BloomHash: chunk.BloomHash,
    65  					BloomSize: chunk.BloomSize,
    66  					IndexHash: chunk.IndexHash,
    67  					IndexSize: chunk.IndexSize,
    68  				}
    69  				rd := tslib.RangeToBounds(chain, &rng)
    70  				ch.RangeDates = &rd
    71  				s.Chunks = append(s.Chunks, ch)
    72  			}
    73  			modelChan <- &s
    74  		}
    75  
    76  		return output.StreamMany(rCtx, fetchData, opts.Globals.OutputOpts())
    77  	}
    78  }