|
| 1 | +package cc.unitmesh.container.provider |
| 2 | + |
| 3 | +import cc.unitmesh.devti.provider.context.ChatContextItem |
| 4 | +import cc.unitmesh.devti.provider.context.ChatContextProvider |
| 5 | +import cc.unitmesh.devti.provider.context.ChatCreationContext |
| 6 | +import com.github.dockerjava.core.dockerfile.Dockerfile |
| 7 | +import com.intellij.docker.DockerFileSearch |
| 8 | +import com.intellij.docker.dockerFile.DockerPsiFile |
| 9 | +import com.intellij.docker.dockerFile.parser.psi.DockerFileFromCommand |
| 10 | +import com.intellij.openapi.project.Project |
| 11 | +import com.intellij.psi.PsiManager |
| 12 | +import com.intellij.psi.util.PsiTreeUtil |
| 13 | + |
| 14 | +class DockerContextProvider : ChatContextProvider { |
| 15 | + override fun isApplicable(project: Project, creationContext: ChatCreationContext): Boolean = |
| 16 | + DockerFileSearch.getInstance().getDockerFiles(project).isNotEmpty() |
| 17 | + |
| 18 | + override suspend fun collect( |
| 19 | + project: Project, |
| 20 | + creationContext: ChatCreationContext |
| 21 | + ): List<ChatContextItem> { |
| 22 | + val dockerFiles = DockerFileSearch.getInstance().getDockerFiles(project).mapNotNull { |
| 23 | + PsiManager.getInstance(project).findFile(it) as? DockerPsiFile |
| 24 | + } |
| 25 | + |
| 26 | + if (dockerFiles.isEmpty()) return emptyList() |
| 27 | + |
| 28 | + val fromCommands = dockerFiles.mapNotNull { |
| 29 | + PsiTreeUtil.getChildrenOfType(it, DockerFileFromCommand::class.java)?.toList() |
| 30 | + }.flatten() |
| 31 | + |
| 32 | + if (fromCommands.isEmpty()) return listOf( |
| 33 | + ChatContextItem(DockerContextProvider::class, "This project use Docker to run in server") |
| 34 | + ) |
| 35 | + |
| 36 | + val text = "This project use Docker to run in server. Here is related info:\n" + |
| 37 | + fromCommands.joinToString("\n") { it.text } |
| 38 | + |
| 39 | + return listOf(ChatContextItem(DockerContextProvider::class, text)) |
| 40 | + } |
| 41 | +} |
0 commit comments