# 轻量查询 (/zh/docs/rust/query)

不排整盘就能拿到的生肖、星座与命宫主星。



有些问题不需要整张星盘。这五个函数各自只跑到必要的那一步就返回，
结果与完整排盘的对应字段永远一致——它们走的是同一套核心逻辑。

<Callout type="info">
  本页示例统一用 `Language::ZhCN` 排盘，因此输出里的展示值都是中文。
</Callout>

***

## get\_zodiac\_by\_solar\_date [#get_zodiac_by_solar_date]

**用途**　由公历日期取生肖。

**斗数含义**　生肖由**年支**决定，而年支的换算时点受 `year_divide` 影响。
正月初一与立春之间出生的人，两种配置会得到不同的生肖——这不是 bug，是流派差异。

**签名**

```rust
pub fn get_zodiac_by_solar_date(
    solar_date: &str,
    language: Language,
    config: Config,
) -> Result<String, IztroError>
```

**参数**

| 参数           | 类型         | 必填 | 默认 | 说明                   |
| ------------ | ---------- | -- | -- | -------------------- |
| `solar_date` | `&str`     | 是  | —  | 公历日期，格式 `YYYY-M-D`   |
| `language`   | `Language` | 是  | —  | 输出语言                 |
| `config`     | `Config`   | 是  | —  | 仅 `year_divide` 影响结果 |

**返回值**　`String`——按语言翻译的生肖名。

**示例**

```rust
println!("{}", get_zodiac_by_solar_date("2000-8-16", Language::ZhCN, Config::default())?);
```

**输出**

```text
龙
```

**边界与陷阱**

<Callout type="warn" title="跨年边界会随配置改变">
  默认按正月初一换年。改成 `YearDivide::Exact` 后按立春换年，
  1 月下旬到 2 月上旬出生的人可能拿到不同生肖。
</Callout>

***

## get\_sign\_by\_solar\_date / get\_sign\_by\_lunar\_date [#get_sign_by_solar_date--get_sign_by_lunar_date]

**用途**　取星座。

**斗数含义**　星座是西洋占星概念，只由公历日期决定，与斗数算法无关。
农历版本先把农历转成公历再判定，因此两者对同一天的结果相同。

**签名**

```rust
pub fn get_sign_by_solar_date(solar_date: &str, language: Language) -> Result<String, IztroError>
pub fn get_sign_by_lunar_date(
    lunar_date: &str,
    is_leap_month: bool,
    language: Language,
) -> Result<String, IztroError>
```

**参数**

| 参数                          | 类型         | 必填 | 默认 | 说明               |
| --------------------------- | ---------- | -- | -- | ---------------- |
| `solar_date` / `lunar_date` | `&str`     | 是  | —  | 日期，格式 `YYYY-M-D` |
| `is_leap_month`             | `bool`     | 是  | —  | 仅农历版本：该月是否闰月     |
| `language`                  | `Language` | 是  | —  | 输出语言             |

无 `config` 参数——星座不受任何配置影响。

**返回值**　`String`。

**示例**

```rust
println!("{}", get_sign_by_solar_date("2000-8-16", Language::ZhCN)?);
println!("{}", get_sign_by_lunar_date("2000-7-17", false, Language::ZhCN)?);
```

**输出**

```text
狮子座
狮子座
```

***

## get\_major\_star\_by\_solar\_date / get\_major\_star\_by\_lunar\_date [#get_major_star_by_solar_date--get_major_star_by_lunar_date]

**用途**　只取命宫主星，不排整盘。

**斗数含义**　命宫主星是斗数最常被单独问起的一项。
命宫为空宫时按惯例借对宫主星来看，本函数已经处理了这一步。

**签名**

```rust
pub fn get_major_star_by_solar_date(
    solar_date: &str,
    time_index: u8,
    fix_leap: bool,
    language: Language,
    config: Config,
) -> Result<String, IztroError>

pub fn get_major_star_by_lunar_date(
    lunar_date: &str,
    time_index: u8,
    leap: LeapMonth,
    language: Language,
    config: Config,
) -> Result<String, IztroError>
```

**参数**

| 参数                          | 类型          | 必填 | 默认 | 说明                                                                                  |
| --------------------------- | ----------- | -- | -- | ----------------------------------------------------------------------------------- |
| `solar_date` / `lunar_date` | `&str`      | 是  | —  | 日期                                                                                  |
| `time_index`                | `u8`        | 是  | —  | 时辰索引 0–12，命宫由月份与时辰共同决定                                                              |
| `fix_leap`                  | `bool`      | 是  | —  | 仅阳历版本：阳历日期落在闰月十五之后时是否视作次月                                                           |
| `leap`                      | `LeapMonth` | 是  | —  | 仅农历版本：`NotLeap` / `Leap` / `LeapFixed`，见 [`by_lunar`](/zh/docs/rust/astro#by_lunar) |
| `language`                  | `Language`  | 是  | —  | 输出语言                                                                                |
| `config`                    | `Config`    | 是  | —  | 排盘配置                                                                                |

**返回值**　`String`——多颗主星以逗号分隔；空宫时返回对宫主星。

**示例**

```rust
let cfg = Config::default();

println!("{}", get_major_star_by_solar_date("2000-8-16", 2, true, Language::ZhCN, cfg.clone())?);
println!("{}", get_major_star_by_solar_date("2000-8-16", 2, true, Language::EnUS, cfg.clone())?);
```

**输出**

```text
紫微
emperor
```

**边界与陷阱**

<Accordions>
  <Accordion title="不传时辰拿不到命宫">
    命宫由农历月份与出生时辰共同定位，因此 `time_index` 是必填的。
    只知道日期不知道时辰时，斗数无法给出确定的命宫。
  </Accordion>

  <Accordion title="要判断请用 key 形态">
    返回值是翻译后的字符串，换语言就会变。要做程序判断用下面的
    `major_star_keys_of_soul_palace`，或排整盘后比较 `major_stars` 里的 `key`。
  </Accordion>
</Accordions>

***

## major\_star\_keys\_of\_soul\_palace [#major_star_keys_of_soul_palace]

**用途**　命宫主星的语言无关标识列表——上面两个函数的 key 形态，供程序判断。

**签名**

```rust
pub fn major_star_keys_of_soul_palace(astrolabe: &Astrolabe) -> Vec<String>
```

收已排好的盘（配合 `by_solar` / `by_lunar` 使用），借宫规则与译文形态共享同一实现：
命宫为空宫时借对宫主星，对宫也无主星时返回空列表。标识与盘面语言无关。

**示例**

```rust
let chart = by_solar("2000-8-16", 2, Gender::Female, true, Language::ZhCN, Config::default())?;

println!("{:?}", major_star_keys_of_soul_palace(&chart));
```

**输出**

```text
["ziweiMaj"]
```
