You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: path_strategy.go
    path of file: ./repos/lal/pkg/hls
    
    the code of the file until where you have to start completion: // Copyright 2020, Chef.  All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)

package hls

import (
	"fmt"
	"path/filepath"
	"strings"

	"github.com/q191201771/lal/pkg/base"
)

// 聚合以下功能：
// - 落盘策略： 生成HLS（m3u8文件+ts文件）时，文件命名规则，以及文件存放规则
// - 路由策略： HTTP请求HLS时，request URI和文件路径的映射规则

type RequestInfo struct {
	StreamName       string // uri结合策略
	FileNameWithPath string // uri结合策略, 从磁盘打开文件时使用
}

type IPathStrategy interface {
	IPathRequestStrategy
	IPathWriteStrategy
}

// IPathRequestStrategy
//
    
func (dps *DefaultPathStrategy) GetRequestInfo(urlCtx base.UrlContext, rootOutPath string) (ri RequestInfo) {
	filename := urlCtx.LastItemOfPath
	filetype := urlCtx.GetFileType()
	fileNameWithoutType := urlCtx.GetFilenameWithoutType()

	if filetype == "m3u8" {
		if filename == playlistM3u8FileName || filename == recordM3u8FileName {
			uriItems := strings.Split(urlCtx.Path, "/")
			ri.StreamName = uriItems[len(uriItems)-2]
			ri.FileNameWithPath = filepath.Join(rootOutPath, ri.StreamName, filename)
		} else {
			ri.StreamName = fileNameWithoutType
			ri.FileNameWithPath = filepath.Join(rootOutPath, ri.StreamName, playlistM3u8FileName)
		}
	} else if filetype == "ts" {
		ri.StreamName = dps.getStreamNameFromTsFileName(filename)
		ri.FileNameWithPath = filepath.Join(rootOutPath, ri.StreamName, filename)
	}

	return
}