code: func Encode(text string, level Level) (*Code, error) {
  	// Pick data encoding, smallest first.
  	// We could split the string and use different encodings
  	// but that seems like overkill for now.
  	var enc coding.Encoding
  	switch {
  	case coding.Num(text).Check() == nil:
  		enc = coding.Num(text)
  	case coding.Alpha(text).Check() == nil:
  		enc = coding.Alpha(text)
  	default:
  		enc = coding.String(text)
  	}
  
  	// Pick size.
  	l := coding.Level(level)
  	var v coding.Version
  	for v = coding.MinVersion; ; v++ {
  		if v > coding.MaxVersion {
  			return nil, errors.New("text too long to encode as QR")
  		}
  		if enc.Bits(v) <= v.DataBytes(l)*8 {
  			break
  		}
  	}
  
  	// Build and execute plan.
  	p, err := coding.NewPlan(v, l, 0)
  	if err != nil {
  		return nil, err
  	}
  	cc, err := p.Encode(enc)
  	if err != nil {
  		return nil, err
  	}
  
  	// TODO: Pick appropriate mask.
  
  	return &Code{cc.Bitmap, cc.Size, cc.Stride, 8}, nil
  }
docs: // Encode returns an encoding of text at the given error correction level.