export type ContainerStatusFilter = "all" | "running" | "stopped" | "error" | "unknown" const statuses = ["running","stopped","error","unknown"] export function readContainersUrl(params: URLSearchParams) { const server = params.get("server"), status = params.get("status"), search = params.get("q") ?? "" let error: string | null = null if (["server","status","q"].some(key=>params.getAll(key).length>1)) error="Параметры контекста контейнеров повторяются." if(server!==null && (!/^[1-9]\d*$/.test(server)||!Number.isSafeInteger(Number(server)))) error="В ссылке указан неверный сервер." if(status!==null&&!statuses.includes(status))error="В ссылке указан неизвестный статус." if(search.length>200)error="Поиск в ссылке слишком длинный." return {server:server??"all",status:(status??"all") as ContainerStatusFilter,search,error} } export function patchContainersUrl(params:URLSearchParams,changes:Record) { const next=new URLSearchParams(params) for(const [key,value] of Object.entries(changes))if(value===null||value==="")next.delete(key);else next.set(key,value) return "/containers"+(next.size?"?"+next.toString():"") }