code: func (r *Rar) Unarchive(source, destination string) error {
  	if !fileExists(destination) && r.MkdirAll {
  		err := mkdir(destination, 0755)
  		if err != nil {
  			return fmt.Errorf("preparing destination: %v", err)
  		}
  	}
  
  	// if the files in the archive do not all share a common
  	// root, then make sure we extract to a single subfolder
  	// rather than potentially littering the destination...
  	if r.ImplicitTopLevelFolder {
  		var err error
  		destination, err = r.addTopLevelFolder(source, destination)
  		if err != nil {
  			return fmt.Errorf("scanning source archive: %v", err)
  		}
  	}
  
  	err := r.OpenFile(source)
  	if err != nil {
  		return fmt.Errorf("opening rar archive for reading: %v", err)
  	}
  	defer r.Close()
  
  	for {
  		err := r.unrarNext(destination)
  		if err == io.EOF {
  			break
  		}
  		if err != nil {
  			if r.ContinueOnError {
  				log.Printf("[ERROR] Reading file in rar archive: %v", err)
  				continue
  			}
  			return fmt.Errorf("reading file in rar archive: %v", err)
  		}
  	}
  
  	return nil
  }
docs: // Unarchive unpacks the .rar file at source to destination.
  // Destination will be treated as a folder name. It supports
  // multi-volume archives.