github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/importer/chunk/parse.go (about)

     1  package chunk
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  	"strconv"
     8  	"strings"
     9  )
    10  
    11  func FromString(r io.Reader, chunker string) (Splitter, error) {
    12  	switch {
    13  	case chunker == "" || chunker == "default":
    14  		return NewSizeSplitter(r, DefaultBlockSize), nil
    15  
    16  	case strings.HasPrefix(chunker, "size-"):
    17  		sizeStr := strings.Split(chunker, "-")[1]
    18  		size, err := strconv.Atoi(sizeStr)
    19  		if err != nil {
    20  			return nil, err
    21  		}
    22  		return NewSizeSplitter(r, int64(size)), nil
    23  
    24  	case strings.HasPrefix(chunker, "rabin"):
    25  		return parseRabinString(r, chunker)
    26  
    27  	default:
    28  		return nil, fmt.Errorf("unrecognized chunker option: %s", chunker)
    29  	}
    30  }
    31  
    32  func parseRabinString(r io.Reader, chunker string) (Splitter, error) {
    33  	parts := strings.Split(chunker, "-")
    34  	switch len(parts) {
    35  	case 1:
    36  		return NewRabin(r, uint64(DefaultBlockSize)), nil
    37  	case 2:
    38  		size, err := strconv.Atoi(parts[1])
    39  		if err != nil {
    40  			return nil, err
    41  		}
    42  		return NewRabin(r, uint64(size)), nil
    43  	case 4:
    44  		sub := strings.Split(parts[1], ":")
    45  		if len(sub) > 1 && sub[0] != "min" {
    46  			return nil, errors.New("first label must be min")
    47  		}
    48  		min, err := strconv.Atoi(sub[len(sub)-1])
    49  		if err != nil {
    50  			return nil, err
    51  		}
    52  
    53  		sub = strings.Split(parts[2], ":")
    54  		if len(sub) > 1 && sub[0] != "avg" {
    55  			log.Error("sub == ", sub)
    56  			return nil, errors.New("second label must be avg")
    57  		}
    58  		avg, err := strconv.Atoi(sub[len(sub)-1])
    59  		if err != nil {
    60  			return nil, err
    61  		}
    62  
    63  		sub = strings.Split(parts[3], ":")
    64  		if len(sub) > 1 && sub[0] != "max" {
    65  			return nil, errors.New("final label must be max")
    66  		}
    67  		max, err := strconv.Atoi(sub[len(sub)-1])
    68  		if err != nil {
    69  			return nil, err
    70  		}
    71  
    72  		return NewRabinMinMax(r, uint64(min), uint64(avg), uint64(max)), nil
    73  	default:
    74  		return nil, errors.New("incorrect format (expected 'rabin' 'rabin-[avg]' or 'rabin-[min]-[avg]-[max]'")
    75  	}
    76  }