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 }