| 1735 | } |
| 1736 | |
| 1737 | fn parse_workspace_service_process_line(line: &str) -> Option<WorkspaceServiceProcess> { |
| 1738 | let (pid, rest) = take_ps_field(line)?; |
| 1739 | let (ppid, rest) = take_ps_field(rest)?; |
| 1740 | let (pgid, command) = take_ps_field(rest)?; |
| 1741 | if !command.contains(" service run ") |
| 1742 | || !command.contains(" --server-kind workspace") |
| 1743 | || !command.contains(" --metadata-path ") |
| 1744 | { |
| 1745 | return None; |
| 1746 | } |
| 1747 | |
| 1748 | let project_root = command_arg_after(command, "--project-root")?; |
| 1749 | let metadata_path = command_arg_after(command, "--metadata-path")?; |
| 1750 | Some(WorkspaceServiceProcess { |
| 1751 | pid: pid.parse().ok()?, |
| 1752 | ppid: ppid.parse().ok()?, |
| 1753 | pgid: pgid.parse().ok()?, |
| 1754 | project_root: PathBuf::from(project_root), |
| 1755 | metadata_path: PathBuf::from(metadata_path), |
| 1756 | }) |
| 1757 | } |
| 1758 | |
| 1759 | fn take_ps_field(line: &str) -> Option<(&str, &str)> { |
| 1760 | let trimmed = line.trim_start(); |